在Razor中将MVC TextBox设置为初始值

时间:2015-09-29 16:10:37

标签: html asp.net-mvc razor html.textboxfor

我是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?< /强>

由于

1 个答案:

答案 0 :(得分:1)

答案为什么?&#34;是因为这不是你应该传递价值的方式。 HTML帮助程序使用一些相当复杂的逻辑来确定字段的值应该是什么,并且因为它根据许多不同的情况而变化,所以添加手动值的尝试在很大程度上被忽略。

Razor查找值的第一个位置是ModelState,它由RequestViewDataViewBag的数据组成。然后,它会查看视图Model。最后,它将回退到&#34;默认&#34; value,它实际上仅适用于非For帮助程序,您可以在其中指定默认值。你不能对For助手做同样事情的原因是因为他们被绑定到一个实际的财产,因此,即使它只是默认为null0或其他。

长和短,如果要绑定到属性并且将其默认为特定值,则该值必须是属性的默认值。例如:

private string phone;
public string Phone
{
    get { return phone ?? "Initial Value"; }
    set { phone = value; }
}

现在,物业本身将始终返回&#34;初始值&#34;如果它之前未设置,那么您的表单字段也将如此。