猿问

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

我在项目中使用MVC 3,并且看到了一个非常奇怪的行为。


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


例如


我有以下代码,作为测试:


<%:Html.Hidden("Step2", Model.Step) %>

<%:Html.HiddenFor(m => m.Step) %>

我认为这两个隐藏字段将具有相同的值。我要做的是,在第一次显示“视图”时将该值设置为1,然后在提交后将“模型”字段的值增加1。


因此,我第一次呈现页面时两个控件的值均为1,但是第二次呈现的值分别为:


<input id="Step2" name="Step2" type="hidden" value="2" />

<input id="Step" name="Step" type="hidden" value="1" />

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


我想念什么?* For HTML帮助程序是否以某种方式缓存值?如果是这样,如何禁用此缓存?


谢谢你的帮助。


aluckdog
浏览 541回答 3
3回答

摇曳的蔷薇

这很正常,这就是HTML助手的工作方式。他们首先使用POST请求的值,然后使用模型中的值。这意味着,即使您在控制器操作中修改了模型的值(如果POST请求中存在相同的变量),您的修改也将被忽略,并将使用POSTed的值。一种可能的解决方法是在试图修改值的控制器操作中,从模型状态中删除该值:// remove the Step variable from the model state&nbsp;// if you want the changes in the model to be// taken into accountModelState.Remove("Step");model.Step = 2;另一种可能性是编写自定义HTML帮助程序,该帮助程序将始终使用模型的值而忽略POST值。还有另一种可能性:<input type="hidden" name="Step" value="<%: Model.Step %>" />

三国纷争

在编写向导时会遇到相同的问题,该向导在每个步骤都显示较大模型的不同部分。来自“第1步”的数据和/或错误将与“第2步”混合,以此类推,直到我最终意识到ModelState被“怪罪”。这是我的简单解决方案:if (oldPageIndex != newPageIndex){&nbsp; &nbsp; ModelState.Clear(); // <-- solution}return View(model[newPageIndex]);
随时随地看视频慕课网APP
我要回答