2012-03-31 43 views
0

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

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

我的问题是,我在这个异常被抛出仍然重定向到默认的错误页面。我不希望发生这种情况。我想要的是在用户所在的相同视图中以友好的div显示自定义异常的消息。你有什么想法,我怎么能做到这一点?

回答

0

我在类似的情况做了什么,我添加了一个属性到我的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); 
} 
+0

谢谢。这种方法的问题是,我需要在引发此异常的所有方法中复制/粘贴try-cacth-AddError。我不想要这个。我需要像中央(基础设施)的地方来处理这个问题。在大多数情况下,我甚至没有支持我的视图相关数据的视图模型。 – 2012-03-31 12:52:44

+0

有一个ViewModel是一个更好的主意,因为它会给你强烈的类型化视图。 – Shyju 2012-03-31 12:54:58

+0

现在不需要虚拟机,特别是当他们似乎在解决我的问题时。 – 2012-03-31 13:29:54

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"]中有某些内容甚至不会尝试对您的视图模型进行任何操作,因为您不会拥有它=>请记住,您的应用程序在执行那个行动。

+0

谢谢,我在异常处理范围中设置了一个断点,它在那里,但我仍然得到黄色屏幕的死亡例外......我不知道如果我仍然应该看到这个,如果我本地运行它(本地主机/ ...)? – 2012-04-01 13:59:01