Foreach на IEnumerable свойство и CheckBoxFor в ASP.Net MVC - PullRequest
11 голосов
/ 09 марта 2010

Я считаю, что этот вопрос относится к любому из помощников "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;}
}

Я создал шаблон редактор под названием «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>

Есть предложения?

Ответы [ 2 ]

12 голосов
/ 20 декабря 2010

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

<%=Html.CheckBoxFor(access) %>

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

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

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

<%=Html.CheckBoxFor(x=>access.HasAccess) %>
5 голосов
/ 09 марта 2010

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

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

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

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

...