ASP.NET MVC 3:使用TextBoxFor覆盖“name”属性

114

使用Html.TextBoxFor时,是否可以覆盖name属性?

我已经尝试过但没有成功。我需要使用TextBoxFor来使客户端验证生效,但由于某些原因,我需要文本框的名称与生成的名称不同。

我已经尝试了以下方法:

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

这适用于ID但不适用于名称。这种情况可能吗?

更新:查看TextBoxFor的代码,似乎没有简单的方法。希望有人能证明我是错的。


"Data" 的数据类型是什么? - archil
重复问题:https://dev59.com/8VnUa4cB1Zd3GeqPet5H 和 https://dev59.com/5VfUa4cB1Zd3GeqPHWCP - Fernando Correia
3
这些问题询问的东西略有不同。此外,这是其中最老的一个,所以我想你的意思是“被复制”,而不是“重复”。 - Rob Stevenson-Leggett
https://dev59.com/pmsz5IYBdhLWcg3wfnwx#44765499 - jaymjarri
11个回答

257

Rob,实际上有一个更简单的方法。不要使用name,而是使用Name

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })

13
大小写敏感是@highwingers,这个微小的细节有潜力节省数小时的时间。 - anar khalilov
3
过度杀伤.. 名字但是ID X_X - Vladimirs
2
奇怪的是,“id”不区分大小写(Id和id都可以正常工作),但“name”不行。 - Vladimirs
12
使用ASP.NET 4时,提供“Name”会产生两个属性,“Name”和“name”,模型绑定器使用“name”。 - GSerg
2
但是处理两个仅大小写不同的属性是维护噩梦的源头... - James McCormack
显示剩余14条评论

44

你是否因为想要给名称添加前缀而提出这个问题?如果是,您可以通过在Controller中设置ViewData.TemplateInfo.HtmlFieldPrefix来实现此操作。

我从Brad Wilson的博客学到了很多关于这方面的知识。


这看起来像是赢家!美丽。 - Rob Stevenson-Leggett
2
他们把那个隐藏得很好,是吧 :) - James McCormack
这刚刚为我节省了一些麻烦和代码重复。 - davidXYZ

14

EditorFor有一个重载函数,可以将name属性作为参数提供:

 @Html.EditorFor(expression, null, name)

1
如果我几个小时前就发现这个,那就可以省下我好几个小时的时间了,哈哈。 - Johnie Karr
有趣的是,类似DropDownListFor这样的帮助程序没有name属性的重载,您必须在html属性参数中指定它(名称要大写)。 - nmit026

10

它被称为微软GOTCHA...

使用大写字母的名称,就像这样

@Html.TextBoxFor(m => m.Reply.Answer, new { Name = "Whatyouwant" })

如果您使用@name,它将不会被覆盖,这真的很重要。这很难弄清楚。谢谢。 - GELR

8
尝试使用EditorFor。如果要确保即使属性类型不是字符串也会呈现文本框,可以将字符串作为模板名称传递。如果属性已经是字符串,则不需要明确指定templatename来呈现文本框,因此可以传递null。请注意,它不需要明确的id参数,它将从元素名称推断出来。并且所有验证功能仍然在EditorFor中有效。
 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")

7

Ben的答案给了我想要的结果,不过你需要用Html.Raw来包裹它。

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))

4
稍微有点“不好看”=),尝试:
@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

似乎这是一个不错且简单的方法。虽然有点hacky :-) - Rob Stevenson-Leggett
嗯,这样做,你不如只使用普通的Html.TextBox。因为在替换后,任何静态类型都已经消失了。 - sharp johnny

2
对我来说,这很有效!希望能对你有所帮助!
@Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })

1
在这个例子中,我基于权限禁用了表单字段,但仍然显示它们。我有一个隐藏字段将值发送给控制器,但想在EditorFor中使用不同的字段名。 模型值后的第一个参数表示“名称”属性,第二个参数是新名称。
@Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });

结果为:
<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 

1
@Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })

我不确定中间的这两个字符串参数中哪一个起作用,但只有当我都输入时它才能正常工作。


这是它的 Id 和名称。这个对我有用。我看了所有的答案,但都没有用,只有这一个。谢谢。 - Orion
public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);。我不知道 templateName 应该是什么,所以我使用了 null。对于 htmlFieldName,我使用了参数的名称(在我的情况下是“ipmi”而不是“IPMI”)。这对我很有帮助。 - BCdotWEB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接