我的理解是,当调用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的一部分之外?