如何在ASP.NET MVC中实现自己的错误视图

Mik*_*yev 1 error-handling asp.net-mvc

在我的ASP.NET MVC应用程序中,我有一个ErrorController,目前只有一个动作方法接收一个名为Error的自定义类,并将其呈现给名为Error.cshtml的视图.目前,Error类中只有2个属性:

public class Error{
   public string UserFriendlyMmessage{get;set;}
   public string ErrorMessage{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

Error.cshtml视图强类型为Error类.每当在action方法中抛出异常时,我都会执行以下操作:

Error error = new Error { UserFriendlyText = "The friendly message", ErrorDescription = "Error to be logged" };
return RedirectToAction("Index", "Error", new System.Web.Routing.RouteValueDictionary(error));
Run Code Online (Sandbox Code Playgroud)

这是ErrorController的action方法:

    public ActionResult Index(Error error)
    {
        return View(model: error, viewName:"Error");
    }
Run Code Online (Sandbox Code Playgroud)

虽然这很好用,但这样所有的模型属性都显示在url中.有没有更好,更常用的方法呢?

小智 5

除了丑陋的查询字符串之外,您还有可能超出查询字符串限制,特别是如果您的消息很长并且您要添加更多属性Error.

一种选择是将属性保存ErrorTempData属性,然后return RedirectToAction("Index", "Error")Index()方法中获取值TempData并呈现视图.

另一种选择是使用HandleErrorAttribute属性根据特定异常呈现视图.例如

[HandleError(ExceptionType = typeof(MyException), View = "MyError")]
[HandleError(ExceptionType = typeof(AnotherException), View = "AnotherError")]
public class BaseController : Controller
{
}
Run Code Online (Sandbox Code Playgroud)

并在/Views/Shared文件夹中添加特定的错误视图(MyError.cshtml)

@model System.Web.Mvc.HandleErrorInfo
....
@Model.Exception.Message // display error message
...
Run Code Online (Sandbox Code Playgroud)

注意HandleErrorInfo使您可以访问控制器和操作名称以及异常详细信息.

然后,在特定方法中,如果抛出异常,将显示关联的视图

public class MyController : BaseController
{
  public ActionResult SomeAction()
  {
    if(someCondition)
    {
      throw new MyException("Some friendly error message");
    }
    return View();
  }
}
Run Code Online (Sandbox Code Playgroud)

MyException内置异常在哪里,或者您拥有源自的自定义异常Exception

请注意,您还需要设置以下内容 web.config

<system.web>
  <customErrors mode="On" defaultRedirect="Error" />
</system.web>
Run Code Online (Sandbox Code Playgroud)