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