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)
Pet*_*r B 18
我在编写向导时遇到了同样的问题,该向导在每一步都显示了较大模型的不同部分.
来自"第1步"的数据和/或错误将与"第2步"等混淆,直到我终于意识到ModelState是'责备'.
这是我的简单解决方案:
if (oldPageIndex != newPageIndex)
{
ModelState.Clear(); // <-- solution
}
return View(model[newPageIndex]);
Run Code Online (Sandbox Code Playgroud)