【问题标题】:Html.HiddenFor value property not getting setHtml.HiddenFor 值属性未设置
【发布时间】:2011-10-14 13:51:35
【问题描述】:

我本来可以用的

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

我是不是做错了什么?? 谢谢

【问题讨论】:

  • 我认为 HiddenFor 不知道如何从 ViewData 中“读取”值。您可以使用 Html.Hidden("fieldName", ViewData["crn"])
  • 对于使用 MVC 4 的任何人,请参阅下面的@Gudradain 答案。

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


【解决方案1】:

您是否尝试过使用视图模型而不是 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。
  • @ScottAdams,我已经使用 [HiddenInput(DisplayValue = false)] 属性修饰了我的视图模型上的 CRN 属性,这将使 EditorFor 帮助器生成一个隐藏字段。
  • @Html.HiddenFor(model =&gt; model.AccionActual) 不工作
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    这将创建一个type="hidden"INPUT 标记,其中包含id="CRN"name="CRN",以及value 属性中的正确值。

    希望对你有帮助!

    【讨论】:

    • 虽然这看起来比Darin's answer 更简单,但它使用了魔术字符串,因此增加了重构等过程中出现问题的可能性。
    【解决方案4】:

    以下内容适用于 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;
    }
    

    【讨论】:

    • 这让我省去了很多挫折。 HiddenFor(t =&gt; t.Id) 不起作用。使用 @value = Model.Id 不起作用。我不得不使用@Value - 大写V 显然很重要。这太糟糕了,一定是一个错误。
    • 是的,大写 V 很重要。此外,@ 似乎不是必需的。 @Value 和 Just Value 都对我有用。
    • 我还是 MVC 的新手,但你在哪里“MyMethod”我拥有的其余代码与你的相似,但我不知道你的方法在哪里。
    • @mgrenier 只是控制器中的一个方法。在这种情况下,它是在您从浏览器发布表单数据后接收表单数据的方法。
    • 我已经使用 MVC 几年了,我才意识到 HiddenFor 没有设置价值。真可惜。感谢您的回答。这对我很有帮助。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      简单的方法

      @{
         Model.CRN = ViewBag.CRN;
      }
      
      @Html.HiddenFor(x => x.CRN)
      

      【讨论】:

        猜你喜欢
        • 2014-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2012-06-01
        • 1970-01-01
        相关资源
        最近更新 更多