有朋友问到,说在MVC3中,如果使用表单提交数据后,会发现一个问题,就是在提交表单后,即使在控制器中对表单中提交的数据做了更改,在新的视图中也无法将修改后的内容显示出来,显示的还是表单提交前的数据。
这个问题如果在处理完数据之后,跳转到其他页面的时候,是能够正常显示的,说明数据已经更新了。
朋友因此非常不解,为什么会出现这种情况呢?我们来看看下面这些代码。
Controller中的代码如下:
[HttpPost]
public ActionResult PostDisposeMethod(PageFormDataModel model)
{
var m = model;
m.PropertyName = "Controller中修改了的数据。"; // 这里假设PropertyName就是PageFormDataModel对象的一个属性,类型为string
return View(m);
}
在视图中的代码很简单了:
@using(Html.BeginForm())
{
这里放些生成表单的代码。。。
}
其实这个问题的原因在于MVC3中,使用ModelState的对象数据,在Cotroller中,我们一旦初始化了ModelState之后,无论我们对对象怎么操作,在放入视图都不会有任何效果。视图默认使用的是ModelState的初始化数据,如果要改变种情况,就要让ModelState感觉到我们修改了。这样视图的参照就会提取新的数据。
操作起来有两种方式:1. 直接清除ModelState;2.修改ModelState中数据。这两种方法都是让ModelState的状态改变。
直接清除ModelState比较简单,MVC中提供Clear方法,只要在return View(m);之前调用ModelState.Clear()即可。
如果在不能清除数据的情况下,如果要更新,可以对ModelState修改下,比如:
ModelState["PropertyName"] =ModelState["PropertyName2"];