Html.Hidden和Html.HiddenFor有什么区别?

我可以在MSDN上findHtml.HiddenFor的一个好的定义,但是我可以在Html.Hidden上find的唯一的东西是和它的问题有关。

有人能给我一个很好的定义和例子。

大多数MVC帮助器方法都有一个XXXFor变体。 它们旨在与具体的模型类一起使用。 我们的想法是允许助手根据您在lambda中指定的属性为窗体input控件派生适当的“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属性相关联。 但是,必须使用string(“Name”)来指定属性的值“Name”,这有些令人厌恶。 如果您重命名模型上的Name属性,您的代码将中断,错误将有点难以弄清楚。 另一方面,如果你使用HiddenFor ,你会得到以下保护:

 Html.HiddenFor(x => x.Name, "Value"); 

现在,如果您重命名Name属性,将会显示一个明确的运行时错误,指示无法find该属性。 另外,您还可以从静态分析中获得其他好处,例如在键入x.之后获取成员的下拉列表x.

Html.Hidden创build一个隐藏的input但是你必须具体的名称和所有的属性,你要赋予该字段和值,而Html.HiddenFor创build一个隐藏的input,你传递给它的对象,他们看起来像这样:

 Html.Hidden("yourProprety",model.yourProprety); Html.HiddenFor(m => m.yourProperty) 

在这种情况下,输出是相同的!

HtmlHelper类中的每个方法都有一个带有For后缀的孪生子。 Html.Hidden需要一个string作为参数,你必须提供,但Html.HiddenFor需要一个expression式 ,如果你是一个强types的视图,你可以从中受益,并为此方法提供一个lambdaexpression式,像这样

 o=>o.SomeProperty 

而不是使用Html.Hidden方法的“ SomeProperty”

Html.Hidden('name','value')创build一个名称='name'和value ='value'的隐藏标签。

Html.HiddenFor(x => x.nameProp)创build一个名称='nameProp'和值= x.nameProp的隐藏标签。

在表面看来,这些似乎做了类似的事情,只有一个比另一个更方便。 但其实际价值是模型绑定。 当MVC尝试将html关联到模型时,它需要具有该属性的名称,对于Html.Hidden,我们select“name”而不是“nameProp”,因此绑定将不起作用。 你必须有一个自定义绑定对象,或者从表单数据中获取值。 如果您正在重新显示页面,则必须再次将模型设置为值。

因此,您可以使用Html.Hidden,但是如果名称错误,或者如果在模型中更改属性名称,则提交表单时自动绑定将失败。 但是通过使用一个types检查expression式,你会得到代码完成,当你改变属性名称,你会得到一个编译时错误。 然后你保证在表格中有正确的名字。

MVC的更好的function之一。

Html.Hidden和Html.HiddenFor用于生成控制器中的操作方法等待的名称 – 值对。 样本用法(*):

 @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)在表单中生成该名称。对于不能用强types模型生成此名称的情况,可以简单地使用stringthats“ProductId”。

 public ViewResult RemoveFromCart(int productId, string returnUrl){...} 

如果我写了Html.HiddenFor(x => line.Product.ProductID),助手将呈现一个名为“line.Product.ProductID”的隐藏字段。 该字段的名称将不匹配等待“ProductId”名称的“RemoveFromCart”操作方法的参数名称。 这将阻止默认模型联编程序的工作,所以MVC框架将无法调用该方法。

Adam Freeman(Apress – Pro ASP.Net MVC 5)