我可以在MSDN上找到Html.HiddenFor的一个很好的定义,但我在Html.Hidden上找到的唯一的东西与它所遇到的问题有关。
有人能给我一个好的定义和一个例子。
答案 0 :(得分:103)
大多数MVC辅助方法都有一个XXXFor变体。它们旨在与具体模型类一起使用。这个想法是允许帮助程序根据您在lambda中指定的属性为表单输入控件派生适当的“name”属性。这意味着您可以消除“魔术字符串”,否则您必须使用它来将模型属性与视图相关联。例如:
Html.Hidden("Name", "Value")
将导致:
<input id="Name" name="Name" type="hidden" value="Value">
在您的控制器中,您可能会执行以下操作:
[HttpPost]
public ActionResult MyAction(MyModel model)
{
}
这样的模型:
public class MyModel
{
public string Name { get; set; }
}
我们上面使用的原始Html.Hidden
将与模型中的Name
属性相关联。但是,必须使用字符串(“Name”)指定属性的值“Name”,这有点令人反感。如果重命名模型上的Name
属性,您的代码将会中断并且错误将难以理解。另一方面,如果您使用HiddenFor
,则会受到以下保护:
Html.HiddenFor(x => x.Name, "Value");
现在,如果重命名Name
属性,您将收到明确的运行时错误,指示无法找到该属性。此外,您还可以获得静态分析的其他好处,例如在键入x.
后获取成员的下拉列表。
答案 1 :(得分:15)
Html.Hidden创建一个隐藏的输入但是您必须具体指定要为该字段和值提供的名称和所有属性,而Html.HiddenFor
为该对象创建一个隐藏的输入传递给它,它们看起来像这样:
Html.Hidden("yourProperty",model.yourProperty);
Html.HiddenFor(m => m.yourProperty)
在这种情况下,输出是相同的!
答案 2 :(得分:7)
HtmlHelper 类中的每个方法都有一个后缀为For
的双胞胎。
Html.Hidden 将字符串作为您必须提供的参数,但 Html.HiddenFor 采用表达式,如果您查看的是强类型视图您可以从中受益并为该方法提供 lambda表达式,就像这样
o=>o.SomeProperty
在使用 Html.Hidden 方法的情况下,而不是“SomeProperty”。
答案 3 :(得分:3)
Html.Hidden(&#39; name&#39;,&#39; value&#39;)会创建一个名为=&#39; name&#39;的隐藏代码。和价值=&#39;价值&#39;。
Html.HiddenFor(x =&gt; x.nameProp)创建一个名为=&#39; nameProp&#39;的隐藏代码。和value = x.nameProp。
从表面看,这些似乎做了类似的事情,一个比另一个更方便。但它的实际价值是模型绑定。当MVC尝试将html与模型相关联时,它需要具有该属性的名称,而对于Html.Hidden,我们选择了&#39; name&#39;,而不是'nameProp&#39;,以及因此绑定不会起作用。您必须拥有自定义绑定对象,或从表单数据中获取值。如果要重新显示页面,则必须再次将模型设置为值。
因此您可以使用Html.Hidden,但如果您输入的名称错误,或者您更改了模型中的属性名称,则在提交表单时自动绑定将失败。但是通过使用类型检查表达式,您将获得代码完成,并且当您更改属性名称时,您将收到编译时错误。然后保证在表格中有正确的名称。
MVC的一个更好的功能。
答案 4 :(得分:2)
Html.Hidden和Html.HiddenFor用于生成名称 - 值对,它们由控制器中的action方法等待。 样本用法(*):
@using (Html.BeginForm("RemoveFromCart", "Cart")) {
@Html.Hidden("ProductId", line.Product.ProductID)
@Html.HiddenFor(x => x.ReturnUrl)
<input class="btn btn-sm btn-warning"
type="submit" value="Remove" />
}
如果您的操作方法等待“ProductId”,您必须通过使用(Html.Hidden或Html.HiddenFor)在表单中生成此名称 对于这种情况,无法使用强类型模型生成此名称,只需使用“ProductId”字符串编写此名称即可。
public ViewResult RemoveFromCart(int productId, string returnUrl){...}
如果我编写了Html.HiddenFor(x =&gt; line.Product.ProductID),帮助程序将呈现名为“line.Product.ProductID”的隐藏字段。 该字段的名称与等待名称“ProductId”的“RemoveFromCart”操作方法的参数名称不匹配。这将阻止默认模型绑定器工作,因此MVC框架将无法调用该方法。
* Adam Freeman(Apress - Pro ASP.Net MVC 5)