2010-03-09 6 views
11

Ich glaube, diese Frage zu einem der „For“ Html Helfer gilt, aber mein spezielles Problem CheckBoxFor wird mit ...Foreach auf IEnumerable Eigenschaft und CheckBoxFor in ASP.Net MVC

Ich habe ein Modell, das aus ist Geben Sie IEnumerable ein, wobei Rechte ein einfaches POCO ist. Dieses Modell ist eigentlich eine Eigenschaft eines größeren Modells, für das ich ein EditorTemplate erstellt habe. Hier ist das größere Bild von meinem Modell:

public class bigmodel 
{ 
    public string Title {get; set;} 
    public string Description {get; set;} 

    [UIHint("ListRights")] 
    public IEnumerable<rights> Rights {get;set;} 
} 

public class rights 
{ 
    public bool HasAccess {get; set;} 
    public string Description {get;set;} 
} 

ich eine editortemplate erstellt namens „LISTRIGHTS“, die meine Hauptansicht verwendet. Zum Beispiel: <% = Html.EditorFor (m => m.Rights)%>.

In ListRights.ascx, möchte ich Code wie folgt:

<table> 
    <% foreach(rights access in Model) 
    { %> 
     <tr> 
     <td> 
      <%=Html.CheckBoxFor(access) %> 
     </td> 
     <td> 
      <%=access.Description %> 
     </td> 
     </tr> 
    <% } %> 
</table> 

Ich weiß, dass die CheckBoxFor Linie nicht funktioniert, aber ich möchte etwas tun, um das gleiche Ergebnis erzeugt, als wenn der Zugriff eine Eigenschaft war auf das Model.

In dem obigen Beispiel möchte ich alles auf Post autobind.

Ich habe versucht, die CheckBox mit Code ähnlich wie diese vorgetäuscht, aber es funktioniert nicht AutoBind:

<table> 
    <% for(int i=0; i < Model.Count(); i++) 
    { %> 
     <tr> 
     <td> 
      <%=Html.CheckBox(string.Format("[{0}].HasAccess",i), Model.ElementAt(i).HasAccess)%> 
     </td> 
     <td> 
      <%=access.Description %> 
     </td> 
     </tr> 
    <% } %> 
</table> 

Irgendwelche Vorschläge?

Antwort

5

fand ich die Antwort durch eine Blog-Post von Steve Sanderson bei http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ mit

Mit "Html.BeginCollectionItem" arbeitete in meiner Situation.

Ich habe ein EditorTemplate für Rechte erstellt (in meinem Beispiel). Dann fügte er Steve's BeginCollectionItem zu dieser Vorlage hinzu. Ich habe die Vorlage mit Html.RenderPartial aufgerufen, wie in Steves Blog vorgeschlagen.

Ich wollte Html.EditorFor (m => m.item) verwenden, aber das funktioniert nicht, weil Element in der ForEach und nicht im Modell ist. Könnte EditorFür diesen Fall verwendet werden?

+0

Ich arbeite nicht bekomme diese Antwort wirklich, warum würdest du all diese Schwierigkeiten durchmachen? – mare

+0

ok, nach einigem Nachdenken und dem Besuch von Steven's Blog sehe ich, was Sie erreichen wollen. Steves Lösungen funktionieren in diesem Fall. Obwohl ich denke, dass die Benutzererfahrung in diesem Fall nicht gut ist - das Bearbeiten mehrerer Elemente auf diese Weise und das Zurücksetzen aller Elemente auf den Controller auf einmal. – mare

12

Ich denke, man Probleme hatte, weil diese nicht

funktioniert hat
<%=Html.CheckBoxFor(access) %> 

und das auch nicht

<%=Html.CheckBoxFor(access=>access.HasAccess) %> 

funktionierte, aber dies sollte

<%=Html.CheckBoxFor(x=>access.HasAccess) %> 
+0

Danke! Das hat mein Leben leichter gemacht! – Craig

+0

Sie ersparen mir viel Schmerz, Amigo. Gracias. –

+0

arbeitete wie ein Charme..danke – shazia

Verwandte Themen