Asp mvc5全局异常处理程序返回到同一页面
本文关键字:一页 返回 mvc5 全局 异常处理程序 Asp | 更新日期: 2023-09-27 18:10:48
我是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中得到的模型是空的,因此当视图加载时,我得到一个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
};
}
如何获得发布的模型?
你需要做的是使用过滤器。过滤器是一个可以应用于控制器以修改其行为的属性。这里是MVC过滤器的官方MSDN文档。
在前面的文档中,您可以看到有一个名为HandleErrorAttribute的过滤器,这是您在特定情况下需要的过滤器。
过滤器可以全局应用(在应用程序启动时注册)或修饰每个单独的控制器。要获得一个很好的解释和示例,您可以阅读这篇博客文章。
请记住,可能存在与您抛出的异常不同的异常。因此,您应该考虑根据异常类型显示不同信息的可能性。这个过滤器允许根据异常类型显示不同的视图。