Foreach on IEnumerable property and CheckBoxFor in ASP.Net MVC

岁酱吖の 提交于 2019-12-18 12:25:41

问题


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?


回答1:


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) %>



回答2:


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?



来源:https://stackoverflow.com/questions/2409552/foreach-on-ienumerable-property-and-checkboxfor-in-asp-net-mvc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!