ASP MVC中显示的自定义异常消息

时间:2012-03-31 12:31:53

标签: asp.net-mvc layout exception-handling

我构建了一个自定义Exception,每当我认为我的应用程序处于“异常状态”时,我就抛出了这个类的实例。这个异常是在应用程序逻辑类(在我的例子中是服务)中抛出的。 现在,我也有默认的ASP MVC异常重定向,但是在这些自定义异常的情况下,我不希望它重定向到'Error'页面,而是在div中显示消息(例如在我的Layout.cshtml页面)。我正在考虑将异常消息添加到TempData [“ApplicationError”]。 我想只编写一次这段代码,而不是我的控制器操作方法。所以,在我的基本控制器类中,我重写了 protected 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中显示自定义异常的消息。您对如何实现这一点有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我在类似的情况下做了什么,我为我的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);
}

答案 1 :(得分:0)

尝试通过设置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属性来呈现视图。显然,如果您有一个与此视图关联的视图模型,您将无法重建它。因此,请确保您的视图的组织方式如果ViewData["ApplicationError"]内部有某些内容甚至没有尝试对您的视图模型执行任何操作,那么您将无法使用它=>记住你的应用程序在执行动作时崩溃了。