Foreach на свойство IEnumerable и CheckBoxFor в ASP.Net MVC

Я считаю, что этот вопрос относится к любому из помощников "For" Html, но моя конкретная проблема заключается в использовании CheckBoxFor...

У меня есть модель, которая имеет тип IEnumerable, где права - это простой POCO. Эта модель на самом деле является свойством более крупной модели, для которой я создал EditorTemplate. Вот большая картина моей модели:

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

Я создал шаблон editortemplate под названием "ListRights", который использует мой основной вид. Например: <% = Html.EditorFor(m = > m.Rights)% > .

В ListRights.ascx я хочу, чтобы код выглядел следующим образом:

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

Я знаю, что строка CheckBoxFor не работает, но я хочу сделать то, что генерирует такой же результат, как если бы доступ был свойством в модели.

В приведенном выше примере я хотел бы, чтобы все автоматически записывалось в сообщении.

Я пробовал фальсифицировать CheckBox с кодом, подобным этому, но он не работает автоматически:

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

Любые предложения?

Ответ 1

Я нашел ответ, используя сообщение в блоге Стив Сандерсон в http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

Использование "Html.BeginCollectionItem" работало в моей ситуации.

Я создал EditorTemplate для прав (в моем примере). Затем добавлен Steve BeginCollectionItem к этому шаблону. Я вызвал шаблон с помощью Html.RenderPartial, как это было предложено в блоге Стив.

Я хотел использовать Html.EditorFor(m = > m.item), но это не работает, потому что элемент находится в ForEach, а не в модели. Может ли редактор использоваться в этом случае?

Ответ 2

Я думаю, у вас были проблемы, потому что это не сработало

<%=Html.CheckBoxFor(access) %>

и это не сработало.

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

но это должно работать

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