asp mvc5全局异常处理程序返回同一页面

时间:2014-06-30 00:35:02

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

我是c#和asp mvc的新手,我无法找到一种方法来全局处理异常,但是从它们生成后返回到同一页面。现在在我的控制器中,我在所有post方法中都有这样的东西:

try
{
    service.Action(object);
    return RedirectToAction("Index");
}
catch (MyBusinessException e)
{
    ViewData["error"] = (e.InnerException.Message ?? "");
    return View(object);
}

内部异常的消息是一条友好的消息,比如“你不能创建两篇具有相同代码的文章”,我想以创建文章的形式向用户展示,而不是将他发送到错误页面

我试图通过创建一个覆盖OnException方法的基本控制器来重现此行为,但我不知道如何返回到我来自同一页面并显示错误消息。

根据@JotaBe

的回复进行修改

我已经创建了一个全局的OnException过滤器,并在FilterConfig.cs中注册,现在我可以从我来的那里返回页面,但是我从ExceptionContext获取的模型是null,因此我得到了一个当视图被加载时出现NullPointerException。

这是我目前的方法:

    public override void OnException(System.Web.Mvc.ExceptionContext filterContext)
    {
        var currentController = (string)filterContext.RouteData.Values["controller"];
        var currentActionName = (string)filterContext.RouteData.Values["action"];

        LOGGER.ErrorFormat("Action: {0} - Controller: {1} - ExceptionMessage: {2} - InnerException: {3}", 
            currentActionName, 
            currentController, 
            filterContext.Exception.Message, 
            filterContext.Exception.InnerException.Message);

        Exception e = filterContext.Exception;
        filterContext.ExceptionHandled = true;
        filterContext.Result = new ViewResult()
        {
            ViewName = currentActionName,   
            ViewData = filterContext.Controller.ViewData,
            MasterName = Master,                
            TempData = filterContext.Controller.TempData
        };
    }

如何获取已发布的模型?

1 个答案:

答案 0 :(得分:0)

您需要做的是使用过滤器。过滤器是可以应用于控制器以修改其行为的属性。 Here you have the official MSDN docs for MVC filters

在上一个文档中,您可以看到有一个名为HandleErrorAttribute的过滤器,这是您特定案例所需的过滤器。

可以全局应用过滤器(在应用程序启动时注册)或装饰每个单独的控制器。有关详细说明和示例,请阅读this blog entry

请记住,可能存在与您抛出的行为不同的行为。因此,您应该考虑根据异常类型显示不同信息的可能性。此过滤器允许根据异常类型显示不同的视图。