Html.HiddenFor 做啥?
Posted
技术标签:
【中文标题】Html.HiddenFor 做啥?【英文标题】:What does Html.HiddenFor do?Html.HiddenFor 做什么? 【发布时间】:2011-04-21 11:17:39 【问题描述】:虽然我已经阅读了有关 html.HiddenFor 的文档,但我还没有掌握它的用途......
有人能解释一下它的用途并举一个简短的例子吗?
这些助手应该在代码中的什么位置?
【问题讨论】:
【参考方案1】:它会在表单上为您传递的字段(来自您的模型)创建一个隐藏输入。
这对于模型/视图模型中的字段很有用,您需要在页面上保留并在进行另一次调用时传回,但用户不应看到这些字段。
考虑以下 ViewModel 类:
public class ViewModel
public string Value get; set;
public int Id get; set;
现在您希望编辑页面存储 ID 但不显示:
<% using(Html.BeginForm() %>
<%= Html.HiddenFor(model.Id) %><br />
<%= Html.TextBoxFor(model.Value) %>
<% %>
这会产生与以下 HTML 等效的结果:
<form name="form1">
<input type="hidden" name="Id">2</input>
<input type="text" name="Value" value="Some Text" />
</form>
【讨论】:
在他上面的例子中 我会说用户“看到”。用户可以“修改”他们想要的任何东西,无论是否隐藏。 @Craig - 你是对的。我实际上虽然我改变了那个措辞,但显然没有。 而且它通常用于您通常不想显示的 ID(如上例所示)。 我有点困惑,因为视图模型不是控制器的参数。那么为什么会在视图模型的字段上生成输入的名称呢?【参考方案2】:并在您的 Edit 操作方法中使用隐藏的 ID 输入:
[HttpPost]
public ActionResult Edit(FormCollection collection)
ViewModel.ID = Convert.ToInt32(collection["ID"]);
【讨论】:
虽然这在技术上是正确的,但如果表单被强类型化到视图模型中,您不应该这样做。您应该能够直接访问模型,从而无需进行任何转换。 @Yetti:不正确。脚手架机制添加 ID 字段是有充分理由的。从我的一个教程中删除它并使用 Fiddler 查看它不在帖子正文中。 我不确定评论是如何不正确的。如果模型是视图中的 For() 属性,则控制器方法应该是强类型的,并由 ModelBinder 自动填充。【参考方案3】:与许多功能一样,这个功能可以以多种不同的方式使用来解决许多不同的问题,我认为它是我们工具带中的又一工具。
到目前为止,讨论主要集中在简单地隐藏 ID 上,但这只是一个值,为什么不将它用于很多值!这就是我正在做的事情,我用它一次只在一个视图中加载一个类中的值,因为 html.beginform 创建了一个新对象,如果该视图的模型对象已经有一些值传递给它,那些除非您在 beginform 中提供对这些值的引用,否则值将会丢失。
要查看 html.hiddenfor 的巨大动力,我建议您查看 Passing data from a View to a Controller in .NET MVC - "@model" not highlighting
【讨论】:
【参考方案4】:Razor 代码@Html.Hidden 或@Html.HiddenFor 的使用类似于下面的Html 代码
<input type="hidden"/>
也可以参考下面的链接
https://msdn.microsoft.com/en-us/library/system.web.mvc.html.inputextensions.hiddenfor(v=vs.118).aspx
【讨论】:
以上是关于Html.HiddenFor 做啥?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net MVC Html.HiddenFor 值错误
@Html.HiddenFor 不适用于 ASP.NET MVC 中的列表