Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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
Asp.net mvc 在ASP MVC中显示自定义异常消息_Asp.net Mvc_Layout_Exception Handling - Fatal编程技术网

Asp.net mvc 在ASP MVC中显示自定义异常消息

Asp.net mvc 在ASP MVC中显示自定义异常消息,asp.net-mvc,layout,exception-handling,Asp.net Mvc,Layout,Exception Handling,我建立了一个自定义异常,每当我认为我的应用程序处于“异常状态”时,我就抛出这个类的一个实例。这个异常是在应用程序逻辑类(在我的例子中是服务)中抛出的。 现在,我也有了默认的ASP MVC异常重定向,但是在这些自定义异常的情况下,我不希望它重定向到“错误”页面,而是在div中显示消息(例如在我的Layout.cshtml页面中)。我正在考虑将异常消息添加到TempData[“ApplicationError”]。 我只想写一次这段代码,而不是写我所有的控制器操作方法。因此,在我的基本控制器类中,我

我建立了一个自定义异常,每当我认为我的应用程序处于“异常状态”时,我就抛出这个类的一个实例。这个异常是在应用程序逻辑类(在我的例子中是服务)中抛出的。 现在,我也有了默认的ASP MVC异常重定向,但是在这些自定义异常的情况下,我不希望它重定向到“错误”页面,而是在div中显示消息(例如在我的Layout.cshtml页面中)。我正在考虑将异常消息添加到TempData[“ApplicationError”]。 我只想写一次这段代码,而不是写我所有的控制器操作方法。因此,在我的基本控制器类中,我重写了受保护的void OnException(ExceptionContext filterContext),我的代码如下所示:

protected override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.Exception is InvalidOperationException)
            TempData["ApplicationError"] = filterContext.Exception.Message;
        else
            base.OnException(filterContext);
    }

我的问题是,当抛出此异常时,我仍然被重定向到默认错误页。我不想发生这种事。我想要的是在用户所在的同一视图上的友好div中显示自定义异常的消息。您对如何实现这一点有什么想法吗?

在中的类似情况下,我在ViewModel中添加了一个属性(我添加到所有其他ViewModel继承自的基类中),用于错误消息和成功消息。无论何时出现错误(应用程序/系统),我都会将该值设置为该属性,并在视图中显示该值。我将始终从控制器返回viewmodel,因此不会显示错误页面

public class BaseViewModel
{
  public string ErrorMessage { set;get;}
  public string SuccessMessage {set;get;}
  public bool IsValid { set;get;}
} 

public class UserViewModel: BaseViewModel
{
  // user properties
}
在我的控制器里

public ActionResult Get(int id)
{

  UserViewModel ovjUser;
  try
  {
    objUser=MyService.GetUser(id);
    if(!objUser.IsValid)
    {
       objUser.ErrorMessage="This User Account is not Valid";
    }
  }
  catch(Exception ex)
  {
   // log error
    objUser.ErrorMessage="Application is buzy now!.Pls try later";
  }
  return View(objUser);
}

通过设置
ExceptionHandled
属性,尝试指示您已处理了异常:

protected override void OnException(ExceptionContext filterContext)
{
    if (filterContext.Exception is InvalidOperationException)
    {
        filterContext.ExceptionHandled = true;
        var viewResult = new ViewResult();
        viewResult.ViewData["ApplicationError"] = filterContext.Exception.Message;
        filterContext.Result = viewResult;
    }
}

一个重要的方面是,由于控制器操作中存在异常,它没有到达返回操作结果的点。因此,您不再知道该操作是否必须呈现视图、返回JSON、重定向或其他。因此,您可以假设它希望通过设置
filterContext.Result
属性来呈现视图。显然,如果您有一个与此视图关联的视图模型,您将无法重建它。因此,确保你的视图组织成这样一种方式:如果内部有代码> View DATA(“Apple PrimeRebug”),甚至不要试图用视图模型做任何事情,因为你不会拥有它=记住你的应用程序在执行的过程中崩溃了。p> 谢谢。这种方法的问题是,我需要在引发此异常的所有方法中复制/粘贴cacth AddError。我不要这个。我需要一个中心(基础设施)的地方来处理这个问题。在大多数情况下,我甚至没有支持视图相关数据的视图模型。拥有视图模型是一个更好的主意,因为它将为您提供强类型视图。只是现在不需要虚拟机,特别是当它们似乎正在解决我的问题时。谢谢,我在异常处理范围中设置了一个断点,它就到了,但我还是得到了死亡的黄屏,除了。。。我不知道如果我在本地运行它(localhost/…),我是否仍然应该看到它?