【问题标题】:Making ModelState Persistent, but not too persistent使 ModelState 持久化,但不要太持久化
【发布时间】:2011-06-11 22:12:25
【问题描述】:

我只是想知道其他人在做什么,而不是快速修复。

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

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

在 OnActionExecuted 的覆盖中我添加了:

TempData["ModelState"] = ModelState;

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

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

【问题讨论】:

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


    【解决方案1】:

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

    这样您就不会尝试重用可能由其他操作编写的模型状态,并且您不必担心“这是正确的模型视图吗?”

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

    【讨论】:

      【解决方案2】:

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

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

      在第 13 点(使用 PRG 模式进行数据修改)。

      它看起来与您正在执行的操作非常相似,但使用了操作过滤器,我还没有注意到错误页面上有任何错误消息。

      【讨论】:

      • 我发现 if (filterContext.Result is ViewResult) 部分不起作用,因为我的结果始终为空,但把它拿出来,它就像一个魅力。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多