簡體   English   中英

MVC4的自定義錯誤

[英]Custom Errors for MVC4

我想使用自己的模型為我的MVC4項目創建一個自定義錯誤頁面。

我使用了來自asp.net MVC3上“自定義錯誤”頁面的 Darin Dimitrov的方法

現在我想使用自己的(測試)模型:

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

現在,當我使用customErrors mode =“ Off”時,一切正常,但僅在本地計算機上。 但是,當我從遠程計算機訪問計算機時,將顯示默認錯誤。 (這是預期的方式-我猜)

現在,當我設置系統時,系統突然期望使用自己的模型而不是我的模型:

“傳遞到字典中的模型項的類型為'System.Web.Mvc.HandleErrorInfo',但是此字典需要模型'Project.Controllers.ErrorModel'的模型項。

當模式關閉時,如何強制系統通過customErrors =“ Off”向遠程系統顯示頁面,或者如何強制他使用我的模型而不是HandleErrorInfo模型?

我的ErrorController

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);
}

發生的情況是您的錯誤處理代碼引發了未處理的異常,然后該異常被默認的aspnet處理程序捕獲。 實際上沒有看到您用於呈現錯誤頁面的視圖,我假設您沒有更改其中的模型類型以匹配控制器中設置的模型。

maf748您的回答完全正確。 有趣的部分是為什么它發生。

當customError關閉時,MVC框架將在global.asax中調用Application_Error()並調用ErrorController(請參閱問題)。 當您將customError切換為On時,在MVC框架上說,可以使用戶處理Exception,找到並渲染View,而不會正確調用ErrorController。 因此,他無法呈現視圖模型,因此使用了默認的viewModel(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);
        }

再次感謝您使我走上正軌,因為所描述的大多數內容都隱藏在框架的后面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM