Foreach em IEnumerable propriedade e CheckBoxFor em ASP.Net MVC
-
18-09-2019 - |
Pergunta
Eu acredito que esta questão se aplica a qualquer um dos "For" ajudantes HTML, mas o meu problema específico está usando CheckBoxFor ...
Eu tenho um modelo que é do tipo IEnumerable, onde os direitos é um POCO simples. Este modelo é realmente uma propriedade de um modelo maior que eu criei um EditorTemplate para. Aqui está a foto maior do meu modelo:
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;}
}
Eu criei um editortemplate chamado "LISTRIGHTS" que meus principais usos vista. Por exemplo: <% = Html.EditorFor (m => m.Rights)%>.
Em ListRights.ascx, eu quero código como este:
<table>
<% foreach(rights access in Model)
{ %>
<tr>
<td>
<%=Html.CheckBoxFor( access ) %>
</td>
<td>
<%=access.Description %>
</td>
</tr>
<% } %>
</table>
Eu sei que a linha CheckBoxFor não trabalho, mas eu quero fazer algo que gera o mesmo resultado, como se o acesso era uma propriedade no modelo.
No exemplo acima, eu gostaria que tudo vinculação automática no post.
Eu tentei simular o CheckBox com código semelhante a este, mas não vinculação automática:
<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>
Todas as sugestões?
Solução 2
Eu encontrei a resposta usando um post no blog de Steve Sanderson em http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/
Usando o "Html.BeginCollectionItem" trabalhou na minha situação.
Eu criei um EditorTemplate de direitos (no meu exemplo). Em seguida, acrescentou BeginCollectionItem de Steve para esse modelo. Liguei para o modelo usando Html.RenderPartial como sugerido no blog de Steve.
Eu queria usar Html.EditorFor (m => m.item), mas isso não funciona porque item está na ForEach e não no modelo. Poderia EditorFor ser usado neste caso?
Outras dicas
Eu acho que você teve problemas, porque isso não funciona
<%=Html.CheckBoxFor(access) %>
e isso não quer trabalhar
<%=Html.CheckBoxFor(access=>access.HasAccess) %>
mas isso deve funcionar
<%=Html.CheckBoxFor(x=>access.HasAccess) %>