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

Can't understand How to decide when to use Hidden() and when to use 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" />
}

这也是他为什么使用 Hidden 而不是 HiddenFor

的解释

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

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

您需要记住,这些助手只是生成 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 参数=14=].

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

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

"Hidden" 方法是更自定义的数据绑定方式,不一定与 ViewModel 相关,但与 Form 相关。

"HiddenFor" 方法只是直接绑定 ViewModel 属性的自动化方式。