隐藏未从视图模型中获取正确的值

时间:2011-01-29 15:47:28

标签: asp.net-mvc

我有一个多步骤文件导入过程。我在视图中有一个隐藏的表单输入,我正在尝试使用视图模型中的“CurrentStep”填充。

<% = Html.HiddenFor(model => model.CurrentStep) %>

CurrentStep是一个枚举,我总是得到默认值,而不是我提供给视图模型的默认值。另一方面,这给了我正确的价值:

<p><% = Model.CurrentStep %></p>

我意识到我可以手工编写隐藏的输入,但我想知道:我做错了什么?有没有更好的方法来跟踪POST之间的当前步骤?

4 个答案:

答案 0 :(得分:71)

您所做错的是您尝试在控制器操作中修改POSTed变量的值。所以我想你正在尝试这样做:

[HttpPost]
public ActionResult Foo(SomeModel model)
{
    model.CurrentStep = Steps.SomeNewValue;
    return View(model);
}

和HiddenFor之类的html帮助程序将始终首先使用POSTed值,然后使用模型中的值。

所以你有几种可能性:

  1. 从模型状态中删除值:

    [HttpPost]
    public ActionResult Foo(SomeModel model)
    {
        ModelState.Remove("CurrentStep");            
        model.CurrentStep = Steps.SomeNewValue;
        return View(model);
    }
    
  2. 手动生成隐藏字段

    <input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" />
    
  3. 编写一个自定义帮助程序,它将使用您的模型的值,而不是正在发布的那个

答案 1 :(得分:6)

我的解决方案是使用Darin的第二个选项,因为选项1(从模型状态清除)意味着对字符串进行硬编码(并且复杂模型的命名约定可能很棘手),并且希望避免选项3因为我已经有这么多自定义助手了。

<input type="hidden" name="@Html.NameFor(x => Model.SomeId)" value="@Model.SomeId" />

提醒您,您可以使用Html.NameFor来保持清洁。

答案 2 :(得分:0)

确保您的模型属性具有“设置”运算符。

这不会在回发时更新:

@ Html.HiddenFor(m => m.NoSeq)

public Class MyModel
{
    int _NoSeq;
    public NoSeq
    {
        get { return _NoSeq };
    }
}

答案 3 :(得分:0)

除了所有这些正确答案之外,让我添加此简单提醒。
注意语法!
print(d) person_id date_1 within_id 0 101 2013-07-07 11:20:00 out of range 1 101 2013-05-07 14:30:00 ABC1 2 101 2013-06-07 14:40:00 out of range 3 101 2014-08-06 00:00:00 out of range 4 101 2014-11-06 00:00:00 out of range 5 101 2013-02-03 12:30:00 out of range 6 101 2014-06-13 00:00:00 out of range 7 202 2011-12-11 00:00:00 DEF1 8 202 2012-10-13 07:00:00 DEF2 9 202 2015-12-13 00:00:00 out of range 10 202 2012-12-13 00:00:00 DEF3 11 202 2012-12-13 18:30:00 DEF3 12 202 2011-07-13 10:00:00 out of range 13 202 2012-12-18 10:00:00 DEF3 14 202 2013-12-19 11:00:00 NaN 中,这两个语句均正确编译。

Razor

我正在努力将自己的 Html.HiddenFor(i => i.Id); //Compiles, but doesn't bind @Html.HiddenFor(i => i.Id); //Compiles and bind 绑定并发送回Id
虽然总是空的。
我错过了Action符号!