Asp.net mvc 未设置Html.HiddenFor值属性

Asp.net mvc 未设置Html.HiddenFor值属性,asp.net-mvc,razor,viewdata,html.hiddenfor,Asp.net Mvc,Razor,Viewdata,Html.hiddenfor,我本可以用 @Html.HiddenFor(x=> ViewData["crn"]) 但是,我知道 为了以某种方式避免这个问题(id=ViewData\u crn\u和name=ViewData[crn]),我尝试了以下操作,但没有设置“value”属性 @Html.HiddenFor(x => x.CRN, new { @value="1"}) @Html.HiddenFor(x => x.CRN, new { @Value="1"}) 产生 <input id=

我本可以用

@Html.HiddenFor(x=> ViewData["crn"])
但是,我知道

为了以某种方式避免这个问题(
id=ViewData\u crn\u和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="" />

我做错什么了吗??
谢谢

您是否尝试过使用视图模型而不是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);
}
让我的控制器操作填充此视图模型:

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
helper:

@model MyViewModel
@Html.EditorFor(x => x.CRN)
这将产生我:

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


在生成的HTML中。

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

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

@Html.Hidden("CRN", ViewData["crn"]);
这将创建一个
type=“hidden”
INPUT
标记,该标记带有
id=“CRN”
name=“CRN”
,并且在
value
属性中包含正确的值


希望有帮助

以下内容将在MVC4中使用

@Html.HiddenFor(x => x.CRN, new { @Value = "1" });
@值属性区分大小写在@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"/>

一个简单的答案是使用@Html.TextboxFor,但将其放在一个用style隐藏的div中。 例子: 鉴于:


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

简单方法

@{
   Model.CRN = ViewBag.CRN;
}

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

我认为HiddenFor不知道如何从ViewData“读取”值。任何使用MVC 4的人都可以使用Html.Hidden(“fieldName”,ViewData[“crn”]),请参见下面的@Gudradain answer。很抱歉对这样一个旧答案发表评论,但是如果您想隐藏输入,您不想使用hiddenfor而不是editorfor吗。@ScottAdams,我已经用
[HiddenInput]修饰了视图模型上的crn属性(DisplayValue=false)]
属性,该属性将使EditorFor帮助程序生成一个隐藏字段。
@Html.HiddenFor(model=>model.AccionActual)
不工作虽然这看起来比使用魔法字符串更简单,因此增加了重构等过程中出现问题的可能性。这让我省去了很多挫折。
HiddenFor(t=>t.Id)
不起作用。使用
@value=Model.Id
不起作用。我不得不使用
@value
-大写字母
V
显然很重要。这很糟糕,一定是个bug。是的,大写字母V很重要。而且,@似乎不是必需的。对我来说,@value和just value都起作用。我对MVC还是新手,但你在哪里“我的方法"我所拥有的其余代码与您的代码类似,但我不知道您的方法去了哪里。@mgrenier它只是控制器中的一个方法。在这种情况下,它是在您从浏览器发布表单数据后接收表单数据的方法。我已经使用MVC几年了,我刚刚意识到HiddenFor没有设置值。这太遗憾了.谢谢你的回答.这真的帮了我的忙。