ASP.Net MVC Html.HiddenFor有错误的值

wil*_*lvv 127 asp.net-mvc hidden-fields asp.net-mvc-3 html.hiddenfor

我在我的项目中使用MVC 3,我看到一种非常奇怪的行为.

我正在尝试为我的模型上的特定值创建一个隐藏字段,问题是由于某种原因,字段上设置的值与模型中的值不对应.

例如

我有这个代码,就像测试一样:

<%:Html.Hidden("Step2", Model.Step) %>
<%:Html.HiddenFor(m => m.Step) %>
Run Code Online (Sandbox Code Playgroud)

我认为两个隐藏的字段都具有相同的值.我所做的是,第一次显示View时将值设置为1,然后在提交后我将Model字段的值增加1.

因此,第一次渲染页面时,两个控件的值都是1,但第二次渲染的值是:

<input id="Step2" name="Step2" type="hidden" value="2" />
<input id="Step" name="Step" type="hidden" value="1" />
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个值是正确的,但第二个值似乎与我第一次显示View时相同.

我错过了什么?*For Html助手是否以某种方式缓存值?如果是这样,我该如何禁用此缓存?

谢谢你的帮助.

Dar*_*rov 186

这是正常的,它是HTML帮助程序的工作方式.他们首先使用POST请求的值,然后使用模型中的值.这意味着即使您在控制器操作中修改模型的值,如果POST请求中存在相同的变量,您的修改也将被忽略,并且将使用POSTed值.

一种可能的解决方法是从控制器操作中的模型状态中删除此值,该操作尝试修改该值:

// remove the Step variable from the model state 
// if you want the changes in the model to be
// taken into account
ModelState.Remove("Step");
model.Step = 2;
Run Code Online (Sandbox Code Playgroud)

另一种可能性是编写一个自定义HTML帮助程序,它将始终使用模型的值并忽略POST值.

另一种可能性:

<input type="hidden" name="Step" value="<%: Model.Step %>" />
Run Code Online (Sandbox Code Playgroud)

  • 我非常感谢Simon Ince的博客文章.我从中得出的结论是确保您的工作流程正确.因此,如果您已经接受了有效的视图模型并使用它完成了某些操作,那么重定向到确认操作,即使这只是简单地转发并显示等效模型.这意味着你有一个新的ModelState.http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx(链接自我写的帖子在今天这个:http://oceanbites.blogspot.com/2011/02/mvc-renders-wrong-value.html) (5认同)
  • 哇,这个让我走了很长一段时间.我基本上使用了第一个建议,但在返回之前只调用了ModelState.Clear().这似乎工作得很好,有没有理由不使用Clear? (5认同)
  • 仅供参考,这种烦人的行为被优雅地转移到 ASP.NET Core 以防万一有人担心事情会好转 (4认同)
  • 我真的很喜欢MVC3,但这一点真的很笨重.我希望他们能在MVC4中修复它. (2认同)
  • 现在我讨厌asp.net mvc. (2认同)

Pet*_*r B 18

我在编写向导时遇到了同样的问题,该向导在每一步都显示了较大模型的不同部分.
来自"第1步"的数据和/或错误将与"第2步"等混淆,直到我终于意识到ModelState是'责备'.

这是我的简单解决方案:

if (oldPageIndex != newPageIndex)
{
    ModelState.Clear(); // <-- solution
}

return View(model[newPageIndex]);
Run Code Online (Sandbox Code Playgroud)

  • `ModelState.Clear()`解决了类似情况下顺序POST请求的问题. (9认同)