Html.HiddenFor值属性未设置

时间:2011-07-27 19:32:47

标签: asp.net-mvc razor viewdata html.hiddenfor

我本来可以用

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

但是,我明白了,

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

以某种方式绕过该问题(id=ViewData_crn_ and name=ViewData[crn]),我尝试执行以下操作,但“值”属性未设置。

@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="" />

我做错了什么? 感谢

6 个答案:

答案 0 :(得分:52)

以下内容适用于MVC 4

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

@Value属性区分大小写。 你需要@Value 上的大写'V'。

这是我的模特

public int CRN { get; set; }

以下是您在浏览器中查看时输出的内容

<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;
}

答案 1 :(得分:38)

您是否尝试过使用视图模型而不是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中。

答案 2 :(得分:5)

我相信有一个更简单的解决方案。 您必须使用Html.Hidden代替Html.HiddenFor。看:

@Html.Hidden("CRN", ViewData["crn"]);

这将创建INPUT type="hidden"代码id="CRN"name="CRN"value,以及{{1}}属性中的正确值。

希望它有所帮助!

答案 3 :(得分:3)

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

答案 4 :(得分:0)

一个简单的答案是使用@ Html.TextboxFor,但将其放置在已隐藏样式的div中。 例: 在视图中:

<div style="display:none"> @Html.TextboxFor(x=>x.CRN) </div>

答案 5 :(得分:0)

简单方法

@{
   Model.CRN = ViewBag.CRN;
}

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