Как использовать EditorFor внутри foreach

У меня есть модель:

public class MyListModel
{
    public int ID {get;set;}
    public List<User> Users{get;set;}
}

Как использовать метод Html.EditorFor внутри foreach?

@model MyListModel
<table>
  <tr>
    <th></th>
  </tr>
  @foreach (var item in Model.Users) {
     <tr>
       <td>
          @Html.EditorFor(item.Enabled)
       </td>
     </tr>
  }
</table>

person Jeremy    schedule 31.12.2009    source источник


Ответы (3)


@Html.EditorFor(x=> item.Enabled)

Много раз указывалось, что отправка такой модели обратно на сервер не будет работать в mvc по умолчанию. Для правильного редактирования с EditorFor в цикле - for следует использовать, как в:

 @for(var i = 0; i< Model.Users.Count;i++){
      Html.EditorFor(i=>Model.Users[i])
 }
person Alexander Taran    schedule 01.01.2010
comment
Определенно работает. Правая часть лямбды не обязательно должна ссылаться на левую часть. - person Eilon; 01.01.2010
comment
Ну, вы бы посмотрели на это! Это очистит некоторые из Html.RenderPartial(), которые я использовал без необходимости. - person Nathan Taylor; 01.01.2010
comment
Вы правы, это работает. Я тоже не думал, что будет. Спасибо. - person Jeremy; 01.01.2010
comment
Имейте в виду, что лямбды — это просто определение метода. Метод может принимать параметр x и фактически не использовать его в теле метода. Крутой трюк, однозначно! Я настоятельно рекомендую прочитать серию из 5 статей Брэда Уилсона о шаблонных помощниках: bradwilson.typepad.com/blog/2009/10/ - person Eilon; 01.01.2010
comment
Я никогда не понимал этого насчет лямбда-выражений; где я был все это время?! - person Nathan Taylor; 01.01.2010
comment
Итак, в этом случае x — это параметр определения метода, item.enabled — это тело, какого типа является x? - person Jeremy; 05.01.2013
comment
x имеет тот же тип, что и model. - person Alexander Taran; 09.01.2013
comment
Обратите внимание, что это приведет к тому, что все элементы, созданные EditorFor, будут иметь одно и то же имя и идентификатор. Недопустимо, чтобы несколько элементов имели один и тот же идентификатор. - person ChadT; 12.04.2013
comment
Это будет работать для отображения свойств, но не будет корректно связываться с обратной передачей по причине, упомянутой @DaRKoN_. DefaultModelBinder понятия не имеет, как связать неиндексированные свойства с повторяющимися именами. Имена — это то, что MVC использует для сопоставления значений из запроса со свойствами вашей модели. - person joelmdev; 02.10.2013
comment
Это решение работает, но привязки будут потеряны, когда вы отправите форму обратно на сервер. Поэтому лучший способ — использовать простой цикл for. - person martonx; 03.12.2014
comment
Не совсем уверен, почему это принятый ответ, если он теряет привязки при отправке обратно на сервер. - person Manachi; 05.04.2018

@for (var i = 0; i < Model.Users.Count; i++)
{
<tr>
    <td>@Html.EditorFor(model => model.Users[i].Enabled)</td>
    <td>@Html.EditorFor(model => model.Users[i].FirstName)</td>
    <td>@Html.EditorFor(model => model.Users[i].LastName)</td>
</tr>
}

Плюс требуются некоторые скрытые переменные хотя бы для одного свойства пользователя:

@for (var i = 0; i < Model.Users.Count; i++)
{
    @Html.HiddenFor(model => model.Users[i].FirstName)
}

Не то, что вы бы назвали элегантным, но это работает в отношении привязки в вашем почтовом действии.

person Jamie    schedule 26.11.2013

Есть ли какая-либо другая причина (помимо примера) для явного использования foreach самостоятельно? Вы можете сделать вспомогательный пользовательский редактор (или дисплей) для User class и сделать @Html.EditorFor(model=>model.Users). Razor будет использовать foreach для внутренней обработки каждого элемента с помощью вашего пользовательского помощника.

Просто идея для тех, кто посещает вопрос, не зная, как управлять этими делами.

person David Silva-Barrera    schedule 14.04.2016