2010-03-09 17 views
11

Credo che a questa domanda si applica a qualsiasi della "Per" aiutanti HTML, ma il mio problema specifico è usando CheckBoxFor ...Foreach sulla proprietà IEnumerable e CheckBoxFor in ASP.Net MVC

Ho un modello che è di digitare IEnumerable, dove diritti è un semplice POCO. Questo modello è in realtà una proprietà di un modello più grande per cui ho creato un EditorTemplate. Ecco il quadro più ampio del mio modello:

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;} 
} 

ho creato un editortemplate chiamata "LISTRIGHTS" che la mia vista principale utilizza. Ad esempio: <% = Html.EditorFor (m => m.Rights)%>.

In ListRights.ascx, voglio codice come questo:

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

So che la linea CheckBoxFor non funziona, ma voglio fare qualcosa che genera lo stesso risultato, come se l'accesso fosse una proprietà su il modello.

Nell'esempio precedente, desidero che tutto funzioni automaticamente su post.

ho provato fingendo il checkbox con codice simile a questo, ma non 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> 

Qualche suggerimento?

risposta

5

ho trovato la risposta utilizzando un post sul blog di Steve Sanderson a http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

Utilizzando "Html.BeginCollectionItem" ha lavorato nella mia situazione.

Ho creato un EditorTemplate per i diritti (nel mio esempio). Quindi aggiunto BeginCollectionItem di Steve a quel modello. Ho chiamato il modello usando Html.RenderPartial come suggerito nel blog di Steve.

Volevo usare Html.EditorFor (m => m.item), ma questo non funziona perché l'elemento è in ForEach e non nel modello. È possibile utilizzare EditorFor in questo caso?

+0

non lo faccio ottieni davvero questa risposta, perché dovresti affrontare tutti questi problemi? – mare

+0

ok, dopo un po 'di riflessione e andando sul blog di Steven vedo quello che stai cercando di ottenere. Le soluzioni di Steve funzionano in questo caso. Anche se non penso che l'esperienza dell'utente sia utile in questo caso, modificando più elementi in questo modo e pubblicandoli tutti al controller in un colpo solo. – mare

12

immagino hai avuto problemi perché questo non ha funzionato

<%=Html.CheckBoxFor(access) %> 

e questo non ha funzionato neanche

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

ma questo dovrebbe funzionare

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

Grazie! Questo mi ha reso la vita più facile! – Craig

+0

Mi hai salvato molto dolore, amigo. Gracias. –

+0

ha funzionato come un fascino ... grazie – shazia