【问题标题】:Redirect to shared Error view from Global.asax on MVC unhandled exception在 MVC 未处理异常上从 Global.asax 重定向到共享错误视图
【发布时间】:2014-09-08 09:52:55
【问题描述】:

我一直在阅读有关在 ASP.MVC 中执行错误处理的不同方法。我知道控制器中的try/catch,以及控制器级别的[HandleError]

但是,我正在尝试对应用程序中任何地方可能发生的未处理异常执行全局错误处理(哇 - 我们从未期望用户这样做!事物的类型)。这样做的结果是向开发人员发送了一封电子邮件:

这工作正常:

protected void Application_Error()
{
    Exception last_ex = Server.GetLastError();
    Server.ClearError();
    // send email here...
    Response.Redirect("/Login/Login");
}

在应用程序的其他地方,如果控制器发生错误,我们有这样的逻辑,它会在错误视图中提供友好的错误:

错误模型

namespace My.Models
{
    public class ErrorViewModel
    {
        public string Summary { get; set; }
        public string Description { get; set; }
    }
}

控制器代码

if(somethingBad){
    return View("Error", new ErrorViewModel { Summary = "Summary here", Description = "Detail here" });
}

我的问题是,是否可以从 Global.asax 中重定向到通过 ErrorViewModel 的错误视图,例如

// send email here...
Response.MethodToGetToView(new ErrorViewModel { Summary = "Error", Description = ex.Message });

【问题讨论】:

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


    【解决方案1】:

    通过 Application_Error 方法,您可以执行以下操作:

    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Error");
    routeData.Values.Add("action","Error500");
    routeData.Values.Add("Summary","Error");
    routeData.Values.Add("Description", ex.Message);
    IController controller = new ErrorController()
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    

    这会将视图从您在此处指定的操作结果返回到用户的浏览器,因此您需要一个控制器和操作结果来返回您想要的错误视图(本例中为 Error/Error500)。它不是重定向,因此在技术上更正确(如果发生错误,您应该立即返回 HTTP 500 状态,而不是像通常那样返回 302 然后返回 500)。

    另外,如果您想从所有 URL(不仅仅是那些与路由匹配的 URL)中捕获所有 404,您可以将以下路由添加到路由配置的末尾

    routes.MapRoute("CatchAllUrls", "{*url}", new { controller = "Error", action = "Error404" }, new string[] { "MyApp.Controllers" });
    

    【讨论】:

    • 所以你的意思是不能直接使用View,而必须先创建ErrorController并在routeData中使用?
    • 是的,没错——此时你需要创建一个控制器实例来返回视图。
    • 或者您可以使用“Response.Redirect”,但您仍然需要控制器操作结果,并且您必须查询模型值
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多