覆盖嵌套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"))

覆盖嵌套EditorFor中的EditorFor ID字段

我怀疑您需要更改idname属性,因为您没有使用视图模型。以下似乎完全错误:

@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。这将解决您的字段命名问题(我只是假设,但这是我唯一能想到的从输入元素中删除前缀的原因)