无法理解何时使用Hidden()和何时使用HiddenFor()。

3

我正在跟随一本书学习,这是代码:

@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的解释:
但是我仍然无法理解他所说的背后原理。您能否再详细说明一些?
public RedirectToRouteResult RemoveFromCart(Cart cart, int productId, string returnUrl)

你的“模型”是什么样子? - Paul
3个回答

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_ProductId将不会与RemoveFromCart控制器操作的已定义参数productId匹配。

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


1
在你的RemoveFromCart(Cart cart, int productId, string returnURL)中,有一个明确的变量,具体而言是int productId。它期望HTML中有一个名为"ProductId"的字段以填充该值。如果使用Html.HiddenFor助手,则会生成带有变量全名的字段,从而导致HTML字段名为"Product_ProductID"。模型绑定器将无法将此字段名与函数调用中的正确参数匹配。

1
如果您的ViewModel属性只需要在视图中传递而不需要进行任何复杂处理,请使用HiddenFor。 "Hidden"方法是一种更自定义的数据绑定方式,与ViewModel不一定相关,而是与表单相关。 "HiddenFor"方法只是直接绑定ViewModel属性的自动化方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接