Html.Hidden和Html.HiddenFor有什么区别

Joe*_*itz 61 c# asp.net-mvc html-helper html.hiddenfor

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

有人可以给我一个很好的定义和一个例子.

Kir*_*oll 111

大多数MVC辅助方法都有一个XXXFor变体.它们旨在与具体模型类一起使用.这个想法是允许帮助程序根据您在lambda中指定的属性为表单输入控件派生适当的"name"属性.这意味着您可以消除"魔术字符串",否则您必须使用它来将模型属性与视图相关联.例如:

Html.Hidden("Name", "Value")
Run Code Online (Sandbox Code Playgroud)

将导致:

<input id="Name" name="Name" type="hidden" value="Value">
Run Code Online (Sandbox Code Playgroud)

在您的控制器中,您可能会执行以下操作:

[HttpPost]
public ActionResult MyAction(MyModel model) 
{
}
Run Code Online (Sandbox Code Playgroud)

和一个模型:

public class MyModel 
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Html.Hidden我们上面使用的原始数据将Name与模型中的属性相关联.但是,必须使用字符串("Name")指定属性的值"Name",这有点令人反感.如果您Name在模型上重命名该属性,您的代码将会中断并且错误将难以理解.另一方面,如果您使用HiddenFor,您将受到以下保护:

Html.HiddenFor(x => x.Name, "Value");
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,如果重命名属性,则会出现COMPILER错误,而不是RUNTIME错误.这就是重点,没有编译,没有运行. (4认同)
  • 感谢Kirk,关于控制器和模型中发生的事情的良好信息. (2认同)
  • @Mystere Man,通常不会编译视图(构建解决方案时).[这是一个手动步骤](http://stackoverflow.com/questions/383192/compile-views-in-asp-net-mvc)让VS为你编译它们. (2认同)
  • [实际上](http://tirania.org/blog/archive/2011/Feb-17.html) 这是在运行时(通常)发生的编译错误。 (2认同)

Mar*_*Leo 15

Html.Hidden创建一个隐藏的输入但你必须具体说明你想要给该字段和值的名称和所有属性,而Html.HiddenFor为你传递给它的对象创建一个隐藏的输入,它们看起来像这样:

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

Html.HiddenFor(m => m.yourProperty)
Run Code Online (Sandbox Code Playgroud)

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

  • twocode - 不,它们都是由代码创建的,但编译器可以从表达式中检测实际的属性名称,从而使事物与模型保持一致.这用于自动模型绑定. (2认同)

Jah*_*ine 7

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

o=>o.SomeProperty 
Run Code Online (Sandbox Code Playgroud)

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