Html.HiddenFor值属性未设置

Sek*_*har 27 asp.net-mvc viewdata razor html.hiddenfor

我本来可以用的

@Html.HiddenFor(x=> ViewData["crn"])
Run Code Online (Sandbox Code Playgroud)

但是,我明白了,

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

以某种方式绕过那个问题(id=ViewData_crn_ and name=ViewData[crn]),我尝试了以下操作,但是"value"属性没有设置.

@Html.HiddenFor(x => x.CRN, new { @value="1"})
@Html.HiddenFor(x => x.CRN, new { @Value="1"})
Run Code Online (Sandbox Code Playgroud)

生成

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

我做错了什么?谢谢

Gud*_*ain 53

以下内容适用于MVC 4

@Html.HiddenFor(x => x.CRN, new { @Value = "1" });
Run Code Online (Sandbox Code Playgroud)

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

这是我的模特

public int CRN { get; set; }
Run Code Online (Sandbox Code Playgroud)

当您在浏览器中查看时,这是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"/>
Run Code Online (Sandbox Code Playgroud)

这是我的方法

[HttpPost]
public ActionResult MyMethod(MyViewModel viewModel)
{
  int crn = viewModel.CRN;
}
Run Code Online (Sandbox Code Playgroud)

  • 这让我少了很多挫折。`HiddenFor(t =&gt; t.Id)` 不起作用。使用 `@value = Model.Id` 不起作用。我不得不使用 `@Value` - 大写的 `V` 显然很重要。这太可怕了,一定是一个错误。 (3认同)
  • 是的,首都V很重要.而且,似乎不需要@.@Value和Just Value都适合我. (2认同)

Dar*_*rov 38

您是否尝试过使用视图模型而不是ViewData?For以类型为弱的类型结构的强类型助手以其结尾并采用lambda表达式ViewData.

我个人不使用ViewData/ViewBag.我定义了视图模型,并让我的控制器操作将这些视图模型传递给我的视图.

例如,在您的情况下,我将定义一个视图模型:

public class MyViewModel
{
    [HiddenInput(DisplayValue = false)]
    public string CRN { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

让我的控制器操作填充此视图模型:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        CRN = "foo bar"
    };
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

然后让我的强类型视图只使用一个EditorFor帮助器:

@model MyViewModel
@Html.EditorFor(x => x.CRN)
Run Code Online (Sandbox Code Playgroud)

哪会产生我:

<input id="CRN" name="CRN" type="hidden" value="foo bar" />
Run Code Online (Sandbox Code Playgroud)

在生成的HTML中.

  • @ScottAdams,我在我的视图模型上使用`[HiddenInput(DisplayValue = false)]`属性修饰了CRN属性,这将使EditorFor助手生成一个隐藏字段. (2认同)

Mar*_*ulo 5

我相信有一个更简单的解决方案.你必须使用Html.Hidden而不是Html.HiddenFor.看:

@Html.Hidden("CRN", ViewData["crn"]);
Run Code Online (Sandbox Code Playgroud)

这将在属性内部创建,使用和INPUT标记正确的值.type="hidden"id="CRN"name="CRN"value

希望能帮助到你!

  • 虽然这可能比[Darin的答案](http://stackoverflow.com/a/6850618/61654)更简单,但它会利用魔术字符串,从而增加重构过程中出现问题的可能性等. (4认同)