Asp.net mvc 3 使用Html.TextBoxFor时,将模型名称作为前缀添加到id

Asp.net mvc 3 使用Html.TextBoxFor时,将模型名称作为前缀添加到id,asp.net-mvc-3,model-view-controller,html-helper,Asp.net Mvc 3,Model View Controller,Html Helper,当我使用asp时,我有一个asp mvc 3项目 @Html.TextBoxFor(model => model.Name) 渲染为的TexBoxFor <input id="Name" name="Name" type="text" value="" /> <input id="UserName" name="UserName" type="text" value="" /> 是否有一种方法可以添加到模型的名称中作为id中的前缀?也许是某种属性 我希望文本框

当我使用asp时,我有一个asp mvc 3项目

@Html.TextBoxFor(model => model.Name)
渲染为的TexBoxFor

<input id="Name" name="Name" type="text" value="" />
<input id="UserName" name="UserName" type="text" value="" />
是否有一种方法可以添加到模型的名称中作为id中的前缀?也许是某种属性

我希望文本框将呈现为

<input id="Name" name="Name" type="text" value="" />
<input id="UserName" name="UserName" type="text" value="" />

您可以编写:

@Html.TextBoxFor(model => model.Name, new { @id= "UserName",@Name="UserName" })

TextBoxFor助手使用作为第一个参数传递的lambda表达式来计算输入字段的名称。因此,如果希望将生成的输入字段称为
用户名
,只需在视图模型中重命名该属性即可:

[DisplayName("Name")]
public string UserName { get; set; }

您应该将DisplayName属性从“名称”更改为“用户名”


如果您这样做,您将得到您想要的。

如果您不想按照模型中的描述呈现输入,您可能不想使用
Html.TextBoxFor
帮助程序

试试
Html.TextBox
。您可以为其提供所需的精确值:

@Html.TextBox("UserName", Model.Name, new { id = "UserName" })
不要忘记,您也可以忘记帮助程序并使用普通的旧html:

<input id="UserName" name="UserName" type="text" value="@Model.Name" />

警告:当使用这两种方法之一和默认模型绑定器时,在提交回数据时,此输入的值将不会正确绑定回您的模型

@Html.TextBoxFor(model => model.attr, new { Name = "txt1" })

只需使用“Name”而不是“Name”

如果我正确理解了您的问题,您希望能够在模型的属性名称上添加字符串前缀

因此,如果您在“帐户”视图中,您将获得

AccountName
TestName
在“测试”视图中,您将获得

AccountName
TestName
如果是这种情况,我认为您最好的选择是覆盖partialforextension方法,类似于这里所做的:

在本例中,它将渲染

Account.Name and Test.Name

如果您希望在视图中称为UserName,为什么不在模型中称为UserName呢?我支持Oyvind的评论,为什么有一个名为Name的属性,用强制“Name”的属性修饰,而您希望它呈现为“UserName”?对我来说似乎很奇怪。这是一个更改属性名称的选项,但是如果有一种方法可以为所有html hrlper添加一些属性,那么它会更好、更简单。您的代码仍然会将
name
属性生成为name。所以,这不是他想要的,这不是问题。他可以写:@Html.TextBoxFor(model=>model.Name,new{@id=“UserName”,@Name=“UserName”}),这是完全错误的!在使用html帮助程序(如
TextBoxFor
)时,不能覆盖
name
属性。顺便说一句,仅供参考,您不需要在那里使用
@
转义字符。您使用带有特殊C#关键字(如
)的
@
转义字符。我需要自动渲染它,并且我不想使用此属性在每个视图中更改它。这与user1958148建议的最流行(直到我否决了它)答案完全相同。不起作用,酒店的名称将是文本框的名称。请您稍微解释一下“警告”部分好吗?表单字段是否尚未在MVC中回发时保存?值根据输入名称绑定到模型。因此,在这种情况下,模型绑定器不知道来自“用户名”输入的值与模型上的“名称”值相对应。如果绑定到模型后试图更改输入的名称属性,则该绑定器可能已经知道它们不会绑定回同一个模型。一种可能的情况是,如果您有一个模型,但仅绑定到一个或两个属性,并且您通过控制器方法上的两个参数进行绑定。-1:这将产生两个名为name:name=“txt1”和name=“attr”的属性。它确实在Firefox中工作,因为浏览器忽略了第二个name属性。但是这本质上是一个错误。哇,我试图覆盖html属性中的名称,但由于名称的小写,它无法工作。非常感谢。