使ModelState持久化,但不是太持久

时间:2011-01-19 17:16:56

标签: c# .net asp.net-mvc error-handling

而不是快速修复,我更想知道别人在做什么。

问题是我使用ModelState向用户报告错误/验证,但是当我使用RedirectToAction()时,ModelState会丢失。为了克服这个问题,我已经向我们的基本控制器添加了一些代码(所有其他控制器都继承了),在OnActionExecuting的覆盖中我添加了:

if (TempData["ModelState"] != null && !ModelState.Equals(TempData["ModelState"]))
    ModelState.Merge((ModelStateDictionary)TempData["ModelState"]);

在OnActionExecuted的覆盖中,我添加了:

TempData["ModelState"] = ModelState;

这个问题是它意味着可以在错误的页面上显示一些错误消息。我只是在我知道想要覆盖/纠正当前错误的操作开始时运行ModelState.clear(),但有些情况下它永远不会被清除,错误会出现在奇怪的地方。

其他人如何处理这个问题?任何想法欢迎。感谢

2 个答案:

答案 0 :(得分:1)

我已经实现了这里提到的解决方案:

http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx

第13点中的

(使用PRG模式进行数据修改)。

它看起来与你正在做的非常相似,但是使用Action Filters,我还没有注意到错误页面上的任何错误消息。

答案 1 :(得分:0)

如果我要这样做,我会使用缓存并使用组合键(会话/控制器/操作)将模型状态存储在缓存(可能是会话)中。它会在2分钟后过期。

这样你就不会重复使用可能由其他一些动作编写的模型状态而你不必担心“这是正确的模型视图吗?”

然后,您可以创建一个属性以应用于您希望重新加载模型状态的每个方法,或者只是根据路径从基础控制器自动执行。