【问题标题】:Custom Errors for MVC4MVC4 的自定义错误
【发布时间】:2014-02-20 14:04:53
【问题描述】:

我想用我自己的模型为我的 MVC4 项目创建一个自定义错误页面。

我使用了来自 Custom error pages on asp.net MVC3 的 Darin Dimitrov 的方法

现在我想使用我自己的(测试)模型:

public class ErrorModel
{
    public string message { get; set; }
}

现在,当我使用 customErrors mode="Off" 时,一切正常,但仅在本地计算机上。当我从远程机器访问机器时,会显示默认错误。 (这是预期的方式 - 我猜)

现在当我设置系统突然期待他自己的模型而不是我的:

“传入字典的模型项是‘System.Web.Mvc.HandleErrorInfo’类型的,但是这个字典需要一个‘Project.Controllers.ErrorModel’类型的模型项。

当模式为 Off 时,我如何强制系统通过 customErrors="Off" 向远程系统显示页面,或者如何强制他使用我的模型而不是 HandleErrorInfo 模型?

我的错误控制器

public class ErrorController : Controller
{
  public ActionResult General(Exception exception)
  {
      var viewModel = new ErrorModel()
      {
          message = exception.Message          
      };
      return View(viewModel);
}

观点:

@model SRMv2.WebUI.Controllers.ErrorModel
@{
}
@Html.Raw(Model.message)

在 Global.asax 中

protected void Application_Error()
{
    HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
    HttpContext.Current.Response.Cache.SetValidUntilExpires(false);          HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Cache.SetNoStore();

    var exception = Server.GetLastError();
    var httpException = exception as HttpException;
    Response.Clear();
    Server.ClearError();
    var routeData = new RouteData();
    routeData.Values["controller"] = "Errors";
    routeData.Values["action"] = "General";
    routeData.Values["exception"] = exception;
    Response.StatusCode = 500;
    if (httpException != null)
    {
       Response.StatusCode = httpException.GetHttpCode();
       switch (Response.StatusCode)
       {
          case 403:
            routeData.Values["action"] = "Http403";
            break;
          case 404:
            routeData.Values["action"] = "Http404";
            break;
        }
     }

   IController errorController = new ErrorController();
   var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
   errorController.Execute(rc);
}

【问题讨论】:

  • 为什么 customErrors="Off" 会显示您的自定义错误消息?也许其他地方有问题。
  • 因为我在 Application_Error 上调用 Global.asax 中的 ErrorController,见:stackoverflow.com/questions/5226791/…

标签: c# asp.net-mvc asp.net-mvc-4 custom-error-pages


【解决方案1】:

发生的情况是您的错误处理代码抛出了一个未处理的异常,然后被默认的 aspnet 处理程序捕获。没有实际看到您用于呈现错误页面的视图,我假设您没有更改其中的模型类型以匹配控制器中设置的模型。

【讨论】:

  • 嗯,那么它根本没有意义。因为当 CustomErrors 切换到 Off 时它正在工作。我想我会在上面添加整个代码。也许这可以清除它
【解决方案2】:

maf748 你的回答完全正确。有趣的部分是它发生的原因。

当 customError 关闭时,MVC 框架调用 global.asax 中的 Application_Error() 并调用 ErrorController(请参阅问题)。 当您将 customError 切换到 On MVC 框架时,用户可以很好地处理异常,找到视图并呈现它,而不会正确调用 ErrorController。所以他无法渲染视图模型,而使用了默认的视图模型(System.Web.Mvc.HandleErrorInfo)。

所以视图不匹配,框架引发了 Application_Error() 并且 Server.GetLastError() 返回视图模型不匹配...这是正确的,然后生成了带有此错误的 ErrorController/View。 ..

所以我的解决方案?

调用ErrorController OnActionExecuted()

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {

        if (filterContext.Exception != null)
        {
            filterContext.ExceptionHandled = true;
            IController errorController = new ErrorController();
            var routeData = new RouteData();
            routeData.Values["controller"] = "Errors";
            routeData.Values["action"] = "General";
            routeData.Values["exception"] = filterContext.Exception;

            var rc = new RequestContext(filterContext.HttpContext, routeData);
            errorController.Execute(rc);
        }

再次感谢您让我走上正轨,因为所描述的大部分内容都隐藏在框架后面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2012-10-26
    相关资源
    最近更新 更多