我构建了一个自定义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中显示自定义异常的消息。您对如何实现这一点有什么想法吗?
答案 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"]
内部有某些内容甚至没有尝试对您的视图模型执行任何操作,那么您将无法使用它=>记住你的应用程序在执行动作时崩溃了。