67

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

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

4

5 回答 5

124

大多数 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.

于 2010-12-07T21:52:20.517 回答
16

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

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

Html.HiddenFor(m => m.yourProperty)

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

于 2010-12-07T21:59:53.630 回答
7

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

o=>o.SomeProperty 

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

于 2010-12-07T21:52:36.027 回答
3

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 的更好特性之一。

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

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

于 2015-07-29T21:39:53.160 回答