2016-08-09 168 views
0

Ich versuche, eine IEnumerable an meine Steuerung übergeben, so dass ich durch jede Zeile durchlaufen kann, einige Änderungen vornehmen und fügen Sie die Datenbank hinzu. Das Problem ist, dass IEnumberableNull ist, wenn es an den Controller zurückgegeben wird.Übergeben IEnumerable zu Controller

ich gelesen habe, dass ich auf meiner Liste IList und Für statt FürJeden verwenden zu ändern - was ich verstehen ... aber jetzt meine IEnumberable Bedürfnisse der Ansicht als IList und ich bestanden werden bin nicht sicher, wie man das macht.

Also, ich habe ein paar Fragen.

  1. Ist IList der einzige Weg zu gehen, kann ich nicht das Modell an die Steuerung als IEnumerable passieren?
  2. Wenn ich mit IList gehen muss, wie kann ich meinen aktuellen AsEnumberable Code ändern, um es an die Ansicht als IList zu senden?

Hier ist der Code, bevor Änderungen zu machen IList wurden aktualisiert:

Get Controller:

public ActionResult Register_step6() 
{ 
    var wp = cg.GetUserWorkPoint(); 
    var model = (from p in db.WorkPointRoles 
       where p.WorkPoint == wp 
       select p).AsEnumerable() 
     .Select(r => new RegisterEmployee_Step6Model() 
    { 
     Role = r.Role, 
     isSelected = false, 
     RoleDescription = cg.GetRoleDescription(r.Role), 
     IconLocation = cg.GetRoleIconLocation(r.Role) 
    }); 

    return View(model); 
} 

Beitrag Controller:

[HttpPost] 
public ActionResult Register_step6(IEnumerable<RegisterEmployee_Step6Model> model) 
{ 
    foreach (var i in model) 
    { 
     //code in here to update db 
    } 
    db.SaveChanges(); 
    } 

     return RedirectToAction("Index"); 
    } 
} 

Ausblick:

@model IEnumerable<core_point.Models.RegisterEmployee_Step6Model> 

@{ 
    ViewBag.Title = "Index"; 
} 
@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <h2>Select the roles that you have been employed to do, by clicking the check-box...</h2> 

    <table class="table"> 
     @foreach (var item in Model) 
     { 
      <tr class="h3"> 
       <td class="vert-align"> 
        <img src="@item.IconLocation" height="80" width="80" /> 
       </td> 

       <td class="vert-align"> 
        @Html.CheckBoxFor(modelItem => item.isSelected, new { @class = "mycheckBox" }) 
       </td> 

       <td class="vert-align"> 
        @Html.DisplayFor(modelItem => item.RoleDescription) 
       </td> 

       <td class="vert-align"> 
        @Html.TextBoxFor(modelItem => item.Role, new { hidden = "hidden" }) 
       </td> 
      </tr> 
     } 

    </table> 
    <div> 
     Roles selected:<input type="number" id="noSelected" value="0" /> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Next" class="btn btn-default" /> 
     </div> 
    </div> 
} 

<script src="~/Scripts/jquery-1.10.2.js"></script> 

<script> 
    var fld_CheckBoxSelected = document.getElementById("CheckBoxSelected"); 
    var fld_noSelected = document.getElementById("noSelected"); 

    $(function(){ 
     $("input.mycheckBox").change(function(){ 
      var isSelected = this.checked; 

      if (isSelected) { 
       $("#noSelected").val(parseInt($("#noSelected").val())+ 1); 
      } 
      else 
      { 
       $("#noSelected").val(parseInt($("#noSelected").val()) - 1); 
      } 
     }); 

    }); 

</script> 

Ansichtsmodell:

public class RegisterEmployee_Step6Model 
{ 
    public byte Id { get; set; } 
    public int? Role { get; set; } 
    public bool isSelected { get; set; } 
    public string RoleDescription { get; set; } 
    public string IconLocation { get; set; } 
} 
+0

Sie können nicht nur die Unterschrift der Controller-Methode ändern, um ein 'IList akzeptieren 'als dein Modell? –

+0

Jeremy, Nein die folgende Meldung erhalten: Das an das Wörterbuch übergebene Modellelement ist vom Typ 'System.Linq.Enumerable + WhereSelectEnumerableIterator'2 [core_point.Models.WorkPointRole, core_point.Models.RegisterEmployee_Step6Model]', aber für dieses Wörterbuch ist ein Modell erforderlich Element des Typs 'System.Collections.Generic.IList'1 [core_point.Models.RegisterEmployee_Step6Model]'. – Ste

+0

Normalerweise verwenden Sie 'ToArray' oder' ToList' anstelle von 'AsEnumerable()' (in der Tat sollten Sie wahrscheinlich 'AsEnumerable()' weglassen, wenn Sie nicht wirklich wissen, was Sie tun). Beide werden als "IEnumerable" und "IList" funktionieren, und es wird mehr Sinn machen, weil Sie * tatsächlich * die Daten materialisieren. In jedem Fall können Sie "IEnumerable" in der gewünschten Ansicht behalten. Achten Sie jedoch darauf, dass Sie die MVC-Regeln von [Bindung an eine Liste] befolgen (http://stackoverflow.com/q/14822615/11683). – GSerg

Antwort

0

Vielen Dank für die Hilfe aller.

änderte ich die Steuerung wie folgt erreichen, ich vorher versuche, die AsEnumerable mit ToList() zu ersetzen

 var model = ((from p in db.WorkPointRoles 
        where p.WorkPoint == wp 
        select p).AsEnumerable() 
     .Select(r => new RegisterEmployee_Step6Model() 
     { 
      Role = r.Role, 
      isSelected = false, 
      RoleDescription = cg.GetRoleDescription(r.Role), 
      IconLocation = cg.GetRoleIconLocation(r.Role) 

     })).ToList(); 
+1

Dies ist komplexer als es sein muss. Sie können einfach 'var model = schreiben (aus r in db.WorkPointRoles, wobei r.WorkPoint == wp neues RegisterEmployee_Step6Model auswählen {Rolle = r.Role, isSelected = false, RoleDescription = cg.GetRoleDescription (r.Role), IconLocation = cg .GetRoleIconLocator (r.Role)). ToList(); ' – Jacob

+0

Das' .AsEnumerable() 'tut nichts, und Sie können im Wesentlichen die erste Auswahl durch die zweite ersetzen. – Jacob