覆盖嵌套EditorFor中的EditorFor ID字段
本文关键字:EditorFor 字段 ID 中的 覆盖 嵌套 | 更新日期: 2023-09-27 18:24:07
嗨,我正试图显式更改EditorFor输出中的ID、Name和Validate For字段。
我有以下代码:
Html.EditorFor(x => ViewBag.NestedFormDatas)
上面用当前模型的名称作为所有字段的前缀。
我的临时解决方案如下(我知道这远非理想,但它有效!):
@Html.Raw(Html.EditorFor(x => ViewBag.NestedFormDatas).ToHtmlString().Replace("NestedForm", "DesiredPrefix"))
我怀疑您需要更改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
帮助程序不能覆盖它。如果你需要实现这一点,你必须编写自己的助手。但正如我所说,如果你使用视图模型,你永远不需要这样做,因为这正是视图模型的目的:它们是专门定义的,以匹配给定视图的要求。
因此,在代码中去掉ViewBag
的任何痕迹,并开始定义视图模型。您将看到ASP.NET MVC将变得更加有趣和简单。
您当然可以尝试使用htmlAttributes参数来用TextBoxFor:覆盖html属性
@Html.TextBoxFor(x=>item.Name,new { id="newId"})
我在查看您的代码时所担心的是,您正在使用动态视图数据字典(ViewBag)和一个用于已知类型的对象属性的方法。我强烈建议将ViewBag替换为具有强类型集合的ViewModel。这将解决您的字段命名问题(我只是假设,但这是我唯一能想到的从输入元素中删除前缀的原因)