隐藏在视图模型中没有得到正确的值

我有一个多步骤的文件导入过程。 我有一个隐藏的窗体input在我看来,我正在试图从视图模型中填充“CurrentStep”。

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

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

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

我意识到我可以手动编码隐藏的input,但我想知道:我做错了什么? 有没有更好的方式来跟踪邮政之间的当前步骤?

提前致谢。

你做错了什么是你试图修改控制器操作中的POSTvariables的值。 所以我想你正在试图做到这一点:

 [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. 写一个自定义的助手,将使用您的模型的价值,而不是被张贴的

我的解决scheme是使用Darin的第二个选项,因为选项1(从模型状态清除)意味着硬编码一个string(并且命名约定对于复杂的模型可能会非常棘手),并且想要避免选项3,因为我已经有了这么多的自定义助手。

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

只是提醒您可以使用Html.NameFor保持干净。