无法理解如何决定何时使用Hidden()以及何时使用HiddenFor()

时间:2015-01-01 19:47:08

标签: c# asp.net-mvc asp.net-mvc-5 html-helper hidden-field

我正在关注一本书,这是代码:

@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" />
}

这也是他对他使用Hidden代替HiddenFor

的原因的解释

enter image description here

但我仍然无法理解他所谈论的背后的布线。你能详细说明一下吗?

public RedirectToRouteResult RemoveFromCart(Cart cart, int productId, string returnUrl)

3 个答案:

答案 0 :(得分:3)

您需要记住,这些帮助程序只是生成HTML标记的方法。

生成的标记示例:

@Html.Hidden("ProductId", line.Product.ProductID)

<强>生成:     <input type="hidden" name="ProductId" value="5" />

@Html.HiddenFor(x => x.Product.ProductID)

<强>生成:     <input type="hidden" name="Product_ProductId" value="5" />

您的控制器定义了一个名为productId的参数。为了使模型绑定起作用,隐藏输入的name值必须与参数名称匹配。

Product_ProductIdproductId控制器操作的已定义参数RemoveFromCart不匹配。

值得注意的是,模型绑定不区分大小写。因此,ProductId的隐藏输入值仍将绑定到RemoveFromCart的{​​{1}}参数。

答案 1 :(得分:1)

在您的RemoveFromCart(Cart cart, int productId, string returnURL)中,您有一个显式变量,特别是int productId。它会在HTML中使用一个名为"ProductId的字段来填充值。如果您使用Html.HiddenFor帮助程序,它会生成全名的字段变量,生成一个名为"Product_ProductID"的HTML字段。模型绑定器无法将带有此字段名称的HTML与函数调用中的正确参数匹配。

答案 2 :(得分:1)

如果您的ViewModel属性只需通过视图而不需要任何复杂的处理,请使用HiddenFor。

&#34; Hidden&#34;方法是更自定义的数据绑定方式,并不一定与您的ViewModel相关,而是与Form相关。

&#34; HiddenFor&#34; method只是直接绑定ViewModel属性的自动方式。