Удалите имя локальной переменной в лямбде из имени 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?

0 ответов

Другие вопросы по тегам