0

我是 ASP.NET MVC 的新手,但我找不到对此的解释。

我的问题是关于当我使用vs.value时生成的 HTML 中属性的差异。@HtmlTextBox()@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属性是 a 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="" />

我的第一个问题是,“为什么生成的 HTML 没有反映我的value属性中的‘初始值’文本?”

众所周知,设置初始值的“正确方法”@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()需要一个大写的 V却仍然生成一个带有空字符串Value的小写 v ?value

谢谢

4

1 回答 1

1

“为什么?”的答案 是因为这不是您应该传递值的方式。HTML 助手使用一些相当复杂的逻辑来确定字段的值应该是什么,并且由于它根据许多不同的情况而有所不同,因此您在很大程度上忽略了手动添加值的尝试。

Razor 查找值的第一个位置是 in ModelState,它由来自和的数据Request组成。然后,它查看视图的. 最后,它将回退到“默认”值,这实际上只适用于非助手,您可以在其中指定默认值。你不能对助手做同样的事情的原因是因为它们绑定到一个实际的属性,因此,即使它只是or或什么的默认值,也要获取该属性的值。ViewDataViewBagModelForFornull0

总而言之,如果你想绑定到一个属性让它默认为一个特定的值,那么这个值需要是该属性的默认值。例如:

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

现在,如果之前未设置,属性本身将始终返回“初始值”,因此您的表单字段也将返回。

于 2015-09-29T16:33:29.493 回答