Удалите имя локальной переменной в лямбде из имени HtmlFieldPrefix
Я понимаю, что когда Html.EditorFor(model => model.User.SomeProperty)
называется.NET передает лямбду к чему-то вроде ExpressionHelper.GetExpressionText(LambdaExpression)
для того, чтобы построить свойства имя / идентификатор. Таким образом, мы должны получить такой элемент:
<input type="text" name="User.SomeProperty" />
Который создает пару имя / значение, которая отправляется обратно и используется для привязки модели.
Все это говорит, я строю локальную переменную в цикле. Когда я передаю это в EditorFor
имя локальной переменной приходит в поездку и добавляется к префиксу поля.
Итак, следующий код:
@foreach (var item in Model.User.Roles)
{
using (Html.BeginCollectionItem("User.Roles"))
{
@Html.EditorFor(model => item.EndDate)
}
}
Создает следующую разметку:
<input type="text" name="User.Roles[guid].item.EndDate" />
Однако я хочу избежать добавления имени локальной переменной как части пути, поэтому в идеале это должно выглядеть так:
<input type="text" name="User.Roles[guid].EndDate" />
Частично проблема в том, что элементы коллекции могут изменяться динамически, поэтому я использую BeginCollectionItem
который добавит первую половину выражения плюс индекс на основе guid.
Я думаю, что этого можно избежать, отрисовав всю роль внутри собственного EditorTemplate следующим образом:
@model UserRole
using (Html.BeginCollectionItem("User.Roles"))
{
@Html.EditorFor(model => model.EndDate)
}
Так как model
кажется защищенным от добавления в дерево выражений. Тем не менее, некоторые элементы внутри цикла нуждаются в доступе к другим элементам на родительском уровне ViewModel, поэтому я стараюсь не передавать визуализацию во вложенный шаблон.
Есть ли способ исключить локальные переменные, такие как item
от того, чтобы быть выпущенным как часть HtmlFieldPrefix?