Asp.net-Mvc

ASP.NET MVC 5 自定義錯誤頁面

  • May 9, 2014

我在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

引用自:https://stackoverflow.com/questions/23565098