Html.hide 和 Html.HiddenFor 之间的区别是什么

我可以为 Html 找到一个很好的定义。HiddenFor 在 MSDN 上,但是我能在 Html 上找到的唯一的东西。隐藏与它所存在的问题有关。

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

144545 次浏览

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

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”,这有点令人反感。如果在 Model 上重命名 Name属性,则代码将中断,并且错误将比较难以发现。另一方面,如果你使用 HiddenFor,你会受到保护:

Html.HiddenFor(x => x.Name, "Value");

现在,如果重命名 Name属性,就会得到一个显式的运行时错误,指示无法找到该属性。此外,静态分析还有其他好处,例如在键入 x.之后获得成员的下拉列表。

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

o=>o.SomeProperty

在使用 隐藏方法的情况下,使用。

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

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


Html.HiddenFor(m => m.yourProperty)

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

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。隐藏或 Html。HiddenFor) 对于这种情况,不可能用强类型模型生成这个名称,您只需使用字符串“ ProductId”编写这个名称。

public ViewResult RemoveFromCart(int productId, string returnUrl){...}

如果我写了 Html。HiddenFor (x = > line.产品。ProductID) ,助手将呈现一个名为“ line”的隐藏字段。产品。产品编号」。 字段的名称与等待“ ProductId”名称的“ RemoveFromCart”操作方法的参数名称不匹配。这将阻止默认模型绑定器的工作,因此 MVC 框架将不能调用该方法。

* Adam Freeman (Apress-Pro ASP.Net MVC 5)

隐藏(‘ name’,‘ value’)创建一个隐藏标记,其中 name = ‘ name’和 value = ‘ value’。

Html.HiddenFor (x = > x.nameProp)创建一个名为 name = ‘ nameProp’和 value = x.nameProp 的隐藏标记。

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

因此,您可以使用 Html。隐藏,但是如果名称错误,或者更改了模型中的属性名,则在提交表单时自动绑定将失败。但是通过使用类型检查表达式,您将得到代码完成,并且当您更改属性名时,您将得到一个编译时错误。然后您就可以保证在表单中使用正确的名称。

MVC 的一个更好的特性。

我想在已经解释过的基础上再补充一些信息。

  • 主要区别在于 HiddenFor是强类型的,而 Hidden不是。
  • 两者都可以在 System.Web.Mvc.Html找到
  • 两个方法都返回: MvcHtmlString-一个将 type 属性设置为“ hide”的输入元素。

官方文件解释道:

@ Html. Hidden ()

Https://learn.microsoft.com/en-us/dotnet/api/system.web.mvc.html.inputextensions.hidden?view=aspnet-mvc-5.2

Hidden(HtmlHelper, String, Object, Object)
  • 通过使用指定的 HTML 助手、表单字段的名称、值和 HTML 属性返回隐藏的输入元素。
Hidden(HtmlHelper, String, Object, IDictionary<String,Object>)
  • 通过使用指定的 HTML 助手、表单字段的名称、值和 HTML 属性返回隐藏的输入元素。
Hidden(HtmlHelper, String, Object)
  • 使用指定的 HTML 助手、表单字段的名称和值返回隐藏的输入元素。 隐藏(HtmlHelper,String)

通过使用指定的 HTML 助手和表单字段的名称返回隐藏的输入元素。

地点:

  • name: 表单字段的名称和用于查找值的 ViewDataDictionary 键。
  • value: 隐藏输入元素的值。该值按照以下顺序检索-ModelStateDictionary 对象、该参数的值、 ViewDataDictionary 对象,最后是 html 属性中的 value 属性。

@ Html. HiddenFor ()

Https://learn.microsoft.com/en-us/dotnet/api/system.web.mvc.html.inputextensions.hiddenfor?view=aspnet-mvc-5.2

HiddenFor<TModel,TProperty>(HtmlHelper<TModel>, Expression<Func<TModel,TProperty>>)
  • 为由指定表达式表示的对象中的每个属性返回 HTML 隐藏输入元素。
HiddenFor<TModel,TProperty>
(HtmlHelper<TModel>,
Expression<Func<TModel,TProperty>>,
IDictionary<String,Object>)
  • 使用指定的 HTML 属性,为由指定表达式表示的对象中的每个属性返回 HTML 隐藏输入元素。
HiddenFor<TModel,TProperty>(HtmlHelper<TModel>, Expression<Func<TModel,TProperty>>, Object)
  • 使用指定的 HTML 属性,为由指定表达式表示的对象中的每个属性返回 HTML 隐藏输入元素。

地点:

  • TModel: 模型的类型。
  • TProperty: 属性的类型。
  • expression: 标识包含要呈现的属性的对象的表达式。