Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp mvc5全局异常处理程序返回到同一页面_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

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

C# asp mvc5全局异常处理程序返回到同一页面,c#,asp.net,asp.net-mvc,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(

我不熟悉c和asp mvc,我找不到全局处理异常的方法,但返回到生成异常的同一页面。现在在我的控制器中,所有post方法中都有类似的内容:

try
{
    service.Action(object);
    return RedirectToAction("Index");
}
catch (MyBusinessException e)
{
    ViewData["error"] = (e.InnerException.Message ?? "");
    return View(object);
}
内部异常的消息是一条友好的消息,就像您不能创建两个具有相同代码的文章一样,我想以createarticle的形式向用户显示它们,而不是将它们发送到错误页面

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

根据@JotaBe的回复进行编辑

我已经创建了一个全局OneException筛选器并在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
        };
    }

如何获取发布的模型?

您需要做的是使用过滤器。筛选器是一个属性,可应用于控制器以修改其行为

在前面的文档中,您可以看到有一个名为的过滤器,它是您特定案例所需的过滤器

过滤器可以全局应用,在应用程序启动时注册,或者装饰每个控制器。对于一个好的解释和示例,您可以阅读


请记住,可以有不同于您抛出的执行。因此,您应该考虑根据异常类型显示不同信息的可能性。此筛选器允许根据异常类型显示不同的视图。

您可以在此处提供更多代码。.您也可以使用global.asax中的Application\u Error方法处理错误。发布的模型是什么?@JotaBe I指的是发布中传递的对象,如:[HttpPost]public ActionResult CreateArticle article{articleService.CreateArticle;return RedirectToActionIndex;}在Create方法中引发的异常,我想返回Create视图,表单中填充的信息与发送的信息相同。对不起我的英语!你想把一般情况变成特殊情况。可能会有很多不同的错误,发生在许多不同的地方:控制器的操作只是一种情况,它可以是get、post、put。。。此外,错误可能发生在管道的其他部分:过滤器、呈现模板的视图引擎。。。因此,您不能保证错误发生在POST中,并且视图中的数据已经可用。事情不是这样的。现在,试着想想你的特殊情况,并具体处理它。您希望这样处理的确切错误是什么?感谢您的回答,我已使用OneException方法更新了原始问题