Html.HiddenFor的value属性未设置

28

我本可以使用

@Html.HiddenFor(x=> ViewData["crn"])

但是,我明白了:

<input id="ViewData_crn_" name="ViewData[crn]" type="hidden" value="500" />

为了绕过这个问题(id=ViewData_crn_和name=ViewData[crn]),我尝试了下面的方法,但是"value"属性没有被设置。

@Html.HiddenFor(x => x.CRN, new { @value="1"})
@Html.HiddenFor(x => x.CRN, new { @Value="1"})

生成

<input id="CRN" name="CRN" type="hidden" value="" />
<input Value="500" id="CRN" name="CRN" type="hidden" value="" />

我有什么做错了吗??谢谢


我认为HiddenFor不知道如何从ViewData中“读取”值。您可以使用Html.Hidden(“fieldName”,ViewData [“crn”]) - Vasea
1
对于使用MVC 4的任何人,请查看下面@Gudradain的答案。 - Yuck
6个回答

55

以下内容适用于MVC 4

@Html.HiddenFor(x => x.CRN, new { @Value = "1" });

@Value属性区分大小写。 在@Value中,需要使用大写的'V'.

这是我的模型

public int CRN { get; set; }

在浏览器中查看时,以下是以HTML格式输出的内容

<input value="1" data-val="true" data-val-number="The field CRN must be a number." data-val-required="The CRN field is required." id="CRN" name="CRN" type="hidden" value="1"/>

这是我的方法

[HttpPost]
public ActionResult MyMethod(MyViewModel viewModel)
{
  int crn = viewModel.CRN;
}

4
这让我少了很多沮丧。HiddenFor(t => t.Id)不起作用。使用@value = Model.Id也不起作用。我必须使用@Value - 大写的 V 显然很重要。这太糟糕了,可能是一个错误。 - Yuck
3
是的,大写的V很重要。另外,似乎不需要使用@符号。@Value和Value都可以正常工作。 - Gudradain
我对MVC还很陌生,但你的"MyMethod"在哪里?我拥有的其余代码与你的类似,但我不知道你的方法放在哪里。 - mgrenier
@mgrenier 这只是控制器中的一个方法。在这种情况下,它是接收从浏览器提交的表单数据的方法。 - Gudradain
Darin的答案是最好的,但这确实有效@Html.HiddenFor(x => x.CRN); 当我有一个带有特定值的方法绑定到我的模型之前,将其发送回显示视图时,我使用了它,因此对我来说,comments.tblTipsId = id; return View(comments); 然后在页面上是@Html.HiddenFor(m => m.tblTipsId)。 - Tom Stickel
1
我已经使用MVC几年了,刚刚意识到HiddenFor不设置值。真遗憾。感谢您的答案。这确实帮助了我。 - Yatin

39
你是否尝试使用视图模型(view model)而非 ViewData? 那些以For结尾并带有lambda表达式的强类型辅助方法无法与弱类型结构,例如ViewData一起使用。个人而言,我不使用 ViewData/ViewBag。我定义视图模型,并让我的控制器动作将这些视图模型传递到我的视图中。例如,在你的情况下,我会定义一个视图模型:
public class MyViewModel
{
    [HiddenInput(DisplayValue = false)]
    public string CRN { get; set; }
}
让我的控制器操作填充这个视图模型:
public ActionResult Index()
{
    var model = new MyViewModel
    {
        CRN = "foo bar"
    };
    return View(model);
}

然后让我的强类型视图简单地使用 EditorFor 辅助方法:

@model MyViewModel
@Html.EditorFor(x => x.CRN)

这将生成:

<input id="CRN" name="CRN" type="hidden" value="foo bar" />

在生成的 HTML 中。


抱歉评论这么旧的答案,但如果您想要输入框被隐藏,难道不应该使用hiddenfor而不是editorfor吗? - Scott Adams
2
@ScottAdams,我已经在我的视图模型上使用[HiddenInput(DisplayValue = false)]属性装饰了CRN属性,这将使EditorFor助手生成一个隐藏字段。 - Darin Dimitrov
@Html.HiddenFor(model => model.AccionActual) 不起作用。 - Kiquenet

5
我认为有一种更简单的解决方案。您可以使用Html.Hidden代替Html.HiddenFor。看看下面的示例:
@Html.Hidden("CRN", ViewData["crn"]);

这将创建一个type="hidden"INPUT标签,带有id="CRN"name="CRN",并在value属性中正确显示值。希望这能帮到您!

4
虽然这种方法看起来比Darin的答案更简单,但它使用了魔术字符串,因此增加了在重构等过程中出现问题的可能性。 - ahsteele

3

请记住,@Html.HiddenFor 的第二个参数只会在找不到与该字段匹配的路由或模型数据时才用于设置值。Darin 是正确的,应使用视图模型。


0
一个简单的答案是使用@Html.TextBoxFor,但将其放置在样式为隐藏的div中。 例如: 在视图中:
@Html.TextBoxFor(x=>x.CRN)

0

简单的方法

@{
   Model.CRN = ViewBag.CRN;
}

@Html.HiddenFor(x => x.CRN)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接