I believe this question applies to any of the "For" Html helpers, but my specific problem is using CheckBoxFor...
I have a model that is of type IEnumerable, where rights is a simple POCO. This model is actually a property of a bigger model that I created an EditorTemplate for. Here is the bigger picture of my model:
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;}
}
I created an editortemplate called "ListRights" that my main view uses. For example: <%=Html.EditorFor(m => m.Rights) %>.
In ListRights.ascx, I want code like this:
<table>
<% foreach(rights access in Model)
{ %>
<tr>
<td>
<%=Html.CheckBoxFor( access ) %>
</td>
<td>
<%=access.Description %>
</td>
</tr>
<% } %>
</table>
I know the CheckBoxFor line does not work, but I want to do something that generates the same result, as if access was a property on the model.
In the above example, I would like everything to autobind on post.
I've tried faking the CheckBox with code similar to this, but it doesn't 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>
Any suggestions?
I guess you had problems because this didn't work
<%=Html.CheckBoxFor(access) %>
and this didn't work either
<%=Html.CheckBoxFor(access=>access.HasAccess) %>
but this should work
<%=Html.CheckBoxFor(x=>access.HasAccess) %>
I found the answer by using a blog post by Steve Sanderson at http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/
Using "Html.BeginCollectionItem" worked in my situation.
I created an EditorTemplate for rights (in my example). Then added Steve's BeginCollectionItem to that template. I called the template using Html.RenderPartial as suggested in Steve's blog.
I wanted to use Html.EditorFor(m => m.item), but that doesn't work because item is in the ForEach and not in the model. Could EditorFor be used in this case?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With