【问题标题】:Persisting Errors between Controllers控制器之间的持续错误
【发布时间】:2011-11-18 14:12:52
【问题描述】:

我有一个关于 ASP .Net MVC 的问题。 我的母版页(工具栏)中有一个电子邮件注册表单,它有一个用于电子邮件的文本字段和一个用于将电子邮件发送到我的主控制器的按钮。

我遇到的问题是,如果我导航到不同控制器中的页面并单击提交以提交我的电子邮件,如果该电子邮件有错误,那么我将错误添加到 ModelState.Errors 然后重定向到原始页面(我在表单的隐藏字段中有原始页面,所以我知道重定向到哪里),因为您可能已经注意到错误丢失了,因为在另一个控制器中我们有一个完全不同的 ModelState。

如果没有错误,电子邮件将被保存并且用户被成功发送到一个完整的页面。

我首先认为我可以将错误保存在 TempData 中,然后检查它是否在动作文件管理器或基本 Controller 类中的某处具有值,并将其添加到新的 Controller ModelState 中。

我想知道是否有任何其他方法或更好的方法,或者即使在 TempData 中发送错误是否是一个好习惯。

谢谢。

【问题讨论】:

    标签: asp.net asp.net-mvc-3


    【解决方案1】:

    POST 操作的通常模式如下:

    [HttpPost]
    public ActionResult Foo(MyModel model)
    {
        if (!ModelState.IsValid)
        {
            // if there were some validation errors redisplay the form so that
            // the user can fix them
            return View(model);
        }
    
        // At this stage we know that the model is valid => we may try do some
        // processing on it:
        if (!Repository.TryDoSomeProcessing(model))
        {
            // Something wen wrong with our processing => redisplay the form
            // to inform the user of this
            ModelState.AddModelError("foo", "bar");
            return View(model);
        }
    
        // at this stage we know that the processing succeeded => we may redirect
        // there will no longer be error messages. We could at maximum use TempData
        // to store some success message:
        TempData["message"] = "Thank you for submitting!";
        return RedirectToAction("Success");
    }
    

    当然,如果您违反此模式并希望通过持续错误等进行重定向……您只能靠自己了。我看到人们在 TempData、Sessions、Cache 等方面苦苦挣扎,以致在重定向之间出现持续错误。我宁愿不评论这些技术。

    【讨论】:

    • 谢谢,我应该使用 Ajax 并省去麻烦!?
    • @Raha,是的,AJAX 可以省去很多麻烦。
    【解决方案2】:

    我使用TempData 在重定向之间保存ModelState 取得了巨大成功,我绝对会推荐它!

    MvcContrib 项目有一个很好的帮手,可以使用操作过滤器轻松保存和恢复 ModelState 到 TempData。

    但是,对于我们的项目,我们需要手动控制,因此我们为 TempData 创建了扩展方法,以便我们可以使用以下代码:

    TempData.SaveModelState(ModelState);
    return Redirect...;
    

    然后恢复:

    TempData.RestoreModelState(ModelState);
    

    这样,我们的网站永远不会呈现来自无效 POST 的视图,它总是重定向到 GET。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 2013-12-01
      • 2011-09-01
      • 2020-12-30
      • 1970-01-01
      • 2023-03-03
      • 2014-01-24
      • 2021-12-29
      相关资源
      最近更新 更多