Asp.net-Mvc
ASP.NET MVC 5 自定義錯誤頁面
我在ASP.NET MVC 5應用程序中使用自定義授權屬性,如下所示:
public class CustomAuthorizeAttribute : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext context) { if (context.HttpContext.Request.IsAuthenticated) { context.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden); } else { base.HandleUnauthorizedRequest(context); } } }在
system.web我的 web.config 部分中,我提到了錯誤路徑,例如:<system.web> <customErrors mode="On" defaultRedirect="/Error/Error"> <error statusCode="403" redirect="/Error/NoPermissions"/> </customErrors> </system.web>但我從來沒有被重定向到我的自定義錯誤頁面
/Error/NoPermissions。相反,瀏覽器會顯示一般錯誤頁面**“HTTP Error 403.0 - Forbidden”**。
謝謝大家,但問題不在於 403 程式碼。實際上問題出在我試圖返回 403 的方式上。我只是將程式碼更改為拋出
HttpException而不是返回,HttpStatusCodeResult並且現在一切正常。HttpException我可以通過拋出異常來返回任何 HTTP 狀態程式碼,並且我的customErrors配置會擷取所有這些程式碼。可能HttpStatusCodeResult是沒有做我期望它做的確切工作。我剛換
context.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);和
throw new HttpException((int)System.Net.HttpStatusCode.Forbidden, "Forbidden");而已。
快樂編碼。
[1]:從 Web.config 中刪除所有“customErrors”和“httpErrors”
[2]:檢查 ‘App_Start/FilterConfig.cs’ 看起來像這樣:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } }[3]:在“Global.asax”中添加這個方法:
public void Application_Error(Object sender, EventArgs e) { Exception exception = Server.GetLastError(); Server.ClearError(); var routeData = new RouteData(); routeData.Values.Add("controller", "ErrorPage"); routeData.Values.Add("action", "Error"); routeData.Values.Add("exception", exception); if (exception.GetType() == typeof(HttpException)) { routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode()); } else { routeData.Values.Add("statusCode", 500); } Response.TrySkipIisCustomErrors = true; IController controller = new ErrorPageController(); controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); Response.End(); }[4]:添加“控制器/ErrorPageController.cs”
public class ErrorPageController : Controller { public ActionResult Error(int statusCode, Exception exception) { Response.StatusCode = statusCode; ViewBag.StatusCode = statusCode + " Error"; return View(); } }[5]:在“視圖/共享/Error.cshtml”中
@model System.Web.Mvc.HandleErrorInfo @{ ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error"; } <h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1> //@Model.ActionName //@Model.ControllerName //@Model.Exception.Message //@Model.Exception.StackTrace:D