[英]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.