从HtmlFieldPrefix名称

时间:2018-10-16 20:27:15

标签: asp.net-mvc asp.net-mvc-5 model-binding begincollectionitem

我的理解是,当调用Html.EditorFor(model => model.User.SomeProperty)时,.NET将lambda传递给类似ExpressionHelper.GetExpressionText(LambdaExpression)的东西,以便建立name / id属性。所以我们应该得到一个像这样的元素:

<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 个答案:

没有答案