5

またはのErrorControllerようなメソッドで呼び出される Controller を設計したので、Web.config に次の行を追加できます。ForbiddenNotFound

<customErrors mode="On" defaultRedirect="~/Error/Unknown" />
    <error statusCode="404" redirect="~/Error/NotFound" />
    <error statusCode="403" redirect="~/Error/Forbidden" />
</customErrors>

だから今、私はそのようなことをしたいと思っています:

public ActionResult Edit(int idObject)
{
    if( user.OnwsObject(idObject) )
    {
        // lets edit
    }
    else
    {
        // ** SEND AN ERROR 403 ***
        // And let ASP.NET MVC with IIS manage that error to send
        // the requester to the Web.config defined error page.
    }
}

問題は、次のようなことを試したことです: (A) throw new HttpException(403, "Error description");: システムがクラッシュする未処理の例外が発生する、(B) return HttpStatusResultCode(403, "Error description"): これらのエラーに対してシステムのデフォルト ページが発生する。

代わりに何を使用すればよいですか?

前もって感謝します。

4

2 に答える 2

5

実際には、403 リダイレクトに web.config を使用することはできません。

できることはOnActionExecuted、コントローラーをオーバーライドしてステータス コードを確認し、web.config で定義されているものにリダイレクトすることです。

Web.config:

<customErrors mode="On">
  <error statusCode="403" redirect="~/Error/Forbidden" />
</customErrors>

あなたのホームコントローラー

public class HomeController : Controller
{
    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.HttpContext.Response.StatusCode == 403)
        {
            var config = (CustomErrorsSection)
                           WebConfigurationManager.GetSection("system.web/customErrors");
            string urlToRedirectTo = config.Errors["403"].Redirect;
            filterContext.Result = Redirect(urlToRedirectTo);
        }
        base.OnActionExecuted(filterContext);
    }

    public ActionResult Edit(int idObject)
    {
         if(!user.OnwsObject(idObject))
         {
             Response.StatusCode = 403;
         }

         return View();
    }
}

エラーコントローラー:

public class ErrorController : Controller
{
    public ActionResult Forbidden()
    {
        Response.StatusCode = 403;
        return View();
    }
}

より一般的な解決策は、コントローラーまたは個々のアクションに適用できるアクション フィルターを作成することです。

public class HandleForbiddenRedirect : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.HttpContext.Response.StatusCode == 403)
        {
            var config = (CustomErrorsSection)
                           WebConfigurationManager.GetSection("system.web/customErrors");
            string urlToRedirectTo = config.Errors["403"].Redirect;
            filterContext.Result = new RedirectResult(urlToRedirectTo);
        }
        base.OnActionExecuted(filterContext);
    }
}

これで、すべてのアクションが 403 でリダイレクトされるように、アクション フィルターをコントローラーに適用できます。

[HandleForbiddenRedirect]
public class HomeController : Controller
{
    //...
}

または、403 で個々のアクションをリダイレクトする

public class HomeController : Controller
{
    [HandleForbiddenRedirect]
    public ActionResult Edit(int idObject)
    {
         //...
    }
}

または、すべてのコントローラーとアクションを装飾するのではなく、どこにでも適用したい場合は、Global.asax の Application_Start のフィルター コレクションに追加できます。

GlobalFilters.Filters.Add(new HandleForbiddenRedirect());
于 2013-07-26T11:11:24.027 に答える
0

この投稿を参照してください。これで問題が解決するはずです。

ASP.NET MVC 4 でカスタム エラー ページを機能させる方法

基本的に、viewresult ORでコントローラーを作成する必要があります

ASP.NET MVC ハンドルエラー

于 2013-07-26T08:53:44.803 に答える