Html.HiddenFor有什么作用?


105

尽管我已经阅读了有关Html.HiddenFor的文档,但我还没有掌握它的用途...

有人可以解释一下它的用法并举一个简短的例子吗?

这些助手在代码中应该放在哪里?

Answers:


112

它在您通过它的字段(来自模型)的表单上创建一个隐藏的输入。

对于Model / ViewModel中的字段很有用,您需要将其保留在页面上,并在进行另一个调用时又传回,但用户不应该看到。

考虑以下ViewModel类:

public class ViewModel
{
    public string Value { get; set; }
    public int Id { get; set; }
}

现在,您希望编辑页面存储ID,但不显示该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>

<%= Html.HiddenFor(model.Id)%>在他的例子以上<br />
布莱斯费

11
我会说用户“看过”。用户可以“修改”他们想要隐藏或不隐藏的任何内容。
Craig Stuntz 2010年

@克雷格-你是对的。实际上,尽管我改变了措辞,但显然没有。
Justin Niessner

它通常用于ID(如上例所示),您通常不想显示该ID。
RickAndMSFT

我有点困惑,因为视图模型不是控制器的参数。那么,为什么要在视图模型的字段上生成输入的名称呢?
约翰

8

并使用您在Edit操作方法上返回的隐藏ID输入:

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}

8
尽管从技术上讲这是正确的,但是如果将表单强类型化为视图模型,则不必这样做。您应该能够直接访问模型,从而无需进行任何转换。
Yetti 2012年

@Yetti:不正确。脚手架机制添加ID字段是有充分理由的。从我的一篇教程中删除它,然后使用Fiddler来查看它不在帖子正文中。
RickAndMSFT

2
我不确定评论有何不正确。如果模型在视图中是For()的属性,则控制器方法应为强类型,并由ModelBinder自动填充。
Erik Philips

2

像许多功能一样,可以以多种不同方式使用此功能来解决许多不同的问题,我认为它是我们工具栏中的另一种工具。

到目前为止,讨论主要集中在简单地隐藏ID上,但这只是一个值,为什么不将其用于很多值!那就是我在做的事,我用它一次只在一个视图中加载一个类中的值,因为html.beginform创建了一个新对象,如果该视图的模型对象已经传递了一些值,除非您在beginform中提供对这些值的引用,否则这些值将丢失。

若要查看html.hiddenfor的强大动机,建议您看到将数据从视图传递到.NET MVC中的控制器-“ @model”不突出显示


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.