C# 在嵌套的EditorFor中重写EditorFor ID字段
您好,我正在尝试显式更改EditorFor输出中字段的ID和名称并进行验证 我有以下代码:C# 在嵌套的EditorFor中重写EditorFor ID字段,c#,asp.net-mvc-3,razor,C#,Asp.net Mvc 3,Razor,您好,我正在尝试显式更改EditorFor输出中字段的ID和名称并进行验证 我有以下代码: Html.EditorFor(x => ViewBag.NestedFormDatas) 以上所有字段都以当前模型的名称作为前缀 我的临时解决方案如下(我知道这远非理想,但它确实有效!): 您当然可以尝试使用htmlAttributes参数,用TextBoxFor覆盖html属性: @Html.TextBoxFor(x=>item.Name,new { id="newId"}) 我在查看您
Html.EditorFor(x => ViewBag.NestedFormDatas)
以上所有字段都以当前模型的名称作为前缀
我的临时解决方案如下(我知道这远非理想,但它确实有效!):
您当然可以尝试使用htmlAttributes参数,用TextBoxFor覆盖html属性:
@Html.TextBoxFor(x=>item.Name,new { id="newId"})
我在查看您的代码时担心的是,您正在使用动态视图数据字典(ViewBag)和一个用于已知类型的对象属性的方法。我强烈建议将ViewBag替换为具有强类型集合的ViewModel。这将解决您的字段命名问题(我只是假设,但这是我唯一能想到的从输入元素中删除前缀的原因)我怀疑您需要更改
id
和name
属性,因为您没有使用视图模型。以下几点似乎完全错了:
@Html.EditorFor(x => ViewBag.NestedFormDatas)
如果正确使用视图模型,则无需更改名称和ID,因为编辑器模板已生成正确的值:
@Html.EditorFor(x => x.NestedFormDatas)
无论如何,一种可能是为给定类型编写自定义编辑器模板。因此,如果我们假设NestedFormDatas
是字符串类型,您可以添加以下~/Views/Shared/EditorTemplates/string.cshtml
编辑器模板以覆盖并允许您指定其他属性:
@Html.TextBox(
"",
ViewData.TemplateInfo.FormattedModelValue,
ViewData
)
然后:
@Html.EditorFor(x => x.NestedFormDatas, new { id = "foo" })
就name
属性而言,这不是可以用TextBox
helper覆盖的。如果需要,您必须编写自己的助手。但正如我所说,如果您使用视图模型,您永远不需要这样做,因为这正是视图模型的目的:它们是专门定义的,以匹配给定视图的需求
因此,在代码中去掉
ViewBag
的任何痕迹,并开始定义视图模型。您将看到ASP.NET MVC将变得多么有趣和简单。Darin,在这种情况下,是否有特别的原因在id前面加上@?我知道这是“课堂”的必修课。。。更重要的是,我不认为您的示例可以用作EditorFor,因为TextBoxFor没有将htmlAttributes作为输入的覆盖parameter@torm,绝对不是。这是我角色的一个坏拷贝粘贴。它已经被删除了。哦,好吧,我想这背后有某种诡计:)编辑呢?你能检查一下吗?我将重新讨论ViewModel方法,但对我来说,这样的方法应该不会太难。然而,我已经说过,我通常不需要与框架抗争,并且发现当我这么做时,通常意味着我做错了!我通常同意使用ViewModel,但我不同意的原因是因为该模型是正确的,但我用于创建视图的方法有点非正统。这很难解释。实际上,在我的视图中,我选择将对象列表移动到另一个编辑器模板中的另一个区域。从用户的角度来看,这是有意义的,但在代码中,我必须修改ID字段以重新连接发布的模型。我的ID需要成为“DesiredPrefix\u 0\uu NestedFormData\u 0\uu Property”,以前是“NestedForm\u 0\uu NestedFormData\u 0\uu Property”。在这种情况下,DesiredPrefix是模型上的另一个列表。
@Html.EditorFor(x => x.NestedFormDatas, new { id = "foo" })