我是ASP.NET MVC的新手,但我还没有找到解释。
我的问题是关于使用value
与@HtmlTextBox()
时生成的HTML中@HtmlTextBoxFor()
属性的差异。
我可以使用<input>
设置@Html.TextBox()
的初始值,如下所示:
@Html.TextBox("Phone", "Initial Value", htmlAttributes: new { id = "txt_phone" })
生成的HTML正是您所期望的:
<input id="txt_phone" name="Phone" type="text" value="Initial Value" />
请注意上面生成的value
属性。
使用@HtmlTextBoxFor()
是另一回事。请注意,我的视图中有一个非常简单的模型。它的Phone
属性为String
。
此处尝试使用@Html.TextBoxFor()
设置初始值:
@Html.TextBoxFor(x => x.Phone, htmlAttributes: new { id = "txt_phone", value="Initial Value" })
但是,生成的HTML不会反映value
属性:
<input id="txt_phone" name="Phone" type="text" value="" />
我的第一个问题是,&#34;为什么生成的HTML不会反映“初始值”&#39;我的value
属性中的文字?&#34;
许多人都知道,正确的方式&#34;用@HtmlTextBoxFor()
设置初始值是这样的:
@Html.TextBoxFor(x => x.Phone, htmlAttributes: new { id = "txt_phone", Value = "Initial Value" })
但请看生成的HTML:
<input Value="Initial Value" id="txt_phone" name="Phone" type="text" value="" />
正如您所看到的那样,它会生成一个Value
属性(带有大写字母V)但它仍会生成一个value
属性,其中包含小写的v和一个空字符串!。
我的第二个问题是,为什么@Html.TextBoxFor()
需要Value
中的资本V但仍会生成带有空字符串的小写v,value
?< /强>
由于
答案 0 :(得分:1)
答案为什么?&#34;是因为这不是你应该传递价值的方式。 HTML帮助程序使用一些相当复杂的逻辑来确定字段的值应该是什么,并且因为它根据许多不同的情况而变化,所以添加手动值的尝试在很大程度上被忽略。
Razor查找值的第一个位置是ModelState
,它由Request
,ViewData
和ViewBag
的数据组成。然后,它会查看视图Model
。最后,它将回退到&#34;默认&#34; value,它实际上仅适用于非For
帮助程序,您可以在其中指定默认值。你不能对For
助手做同样事情的原因是因为他们被绑定到一个实际的财产,因此,即使它只是默认为null
或0
或其他。
长和短,如果要绑定到属性并且将其默认为特定值,则该值必须是属性的默认值。例如:
private string phone;
public string Phone
{
get { return phone ?? "Initial Value"; }
set { phone = value; }
}
现在,物业本身将始终返回&#34;初始值&#34;如果它之前未设置,那么您的表单字段也将如此。