Html.Hidden 和 Html.HiddenFor 有啥区别

Posted

技术标签:

【中文标题】Html.Hidden 和 Html.HiddenFor 有啥区别【英文标题】:What is the difference between Html.Hidden and Html.HiddenForHtml.Hidden 和 Html.HiddenFor 有什么区别 【发布时间】:2011-05-21 21:05:50 【问题描述】:

我可以在 MSDN 上找到 html.HiddenFor 的一个很好的定义,但我在 Html.Hidden 上能找到的唯一内容与它存在的问题有关。

谁能给我一个好的定义和一个例子。

【问题讨论】:

【参考方案1】:

大多数 MVC 辅助方法都有一个 XXXFor 变体。它们旨在与具体的模型类一起使用。这个想法是允许助手根据您在 lambda 中指定的属性为表单输入控件派生适当的“名称”属性。这意味着您可以消除“魔术字符串”,否则您必须使用这些“魔术字符串”来将模型属性与您的视图相关联。例如:

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. 后获得成员的下拉列表。

【讨论】:

谢谢柯克,关于控制器和模型中发生的事情的好信息。 实际上,如果您重命名属性,您会收到编译器错误,而不是运行时错误。这就是重点,编译失败,而不是运行。 @Mystere Man,通常不会编译视图(在构建解决方案时)。 It is a manual step 让 VS 为你编译它们。 Well actually 这是在运行时(通常)发生的编译错误。 在这个Html.Hidden("Name", "Value") 我知道这个&lt;input id="Name" name="Name" type="hidden" value="Value"&gt;【参考方案2】:

Html.Hidden 创建一个隐藏的输入,但您必须指定名称和所有要赋予该字段和值的属性。 Html.HiddenFor 为您传递给它的对象创建一个隐藏输入,它们看起来像这样:

Html.Hidden("yourProperty",model.yourProperty);

Html.HiddenFor(m => m.yourProperty)

在这种情况下,输出是一样的!

【讨论】:

总之,hidden 是由代码创建的东西,hidden 因为它引用了您在代码中创建的内容,对吗? twocode -- 不,它们都是由代码创建的,但是编译器可以从表达式中检测到实际的属性名称,从而使事情与模型保持一致。这用于自动模型绑定。【参考方案3】:

HtmlHelper 类中的每个方法都有一个带有For 后缀的孪生。 Html.Hidden 需要一个字符串作为您必须提供的参数,但 Html.HiddenFor 需要一个 Expression,如果您查看它是一个 强类型视图,您可以从中受益,并为该方法提供 lambda 表达式 像这样

o=>o.SomeProperty 

在使用 Html.Hidden 方法的情况下,而不是“SomeProperty”。

【讨论】:

感谢 Jani 提供有关双胞胎帮手的信息。【参考方案4】:

Html.Hidden('name', 'value') 使用 name = 'name' 和 value = 'value' 创建一个隐藏标签。

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

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

所以你可以使用Html.Hidden,但是如果你把名字弄错了,或者你改变了模型中的属性名,提交表单时自动绑定会失败。但是通过使用类型检查表达式,您将获得代码完成,并且当您更改属性名称时,您将获得编译时错误。然后保证您在表单中具有正确的名称。

MVC 的一个更好的特性。

【讨论】:

【参考方案5】:

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 => line.Product.ProductID),助手将呈现一个名为“line.Product.ProductID”的隐藏字段。 该字段的名称与等待“ProductId”名称的“RemoveFromCart”操作方法的参数名称不匹配。这将阻止默认模型绑定器工作,因此 MVC 框架将无法调用该方法。

*亚当弗里曼(Apress - Pro ASP.Net MVC 5)

【讨论】:

以上是关于Html.Hidden 和 Html.HiddenFor 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

如何将运费从购物车发送到贝宝 [关闭]

使用 Jquery (Razor) 添加 Html 助手

ASP.Net MVC Html.HiddenFor 值错误

简单项目之批量上传

简单项目之批量上传

通过Jquery在C#razor中填充一个变量