4

それがjsonの投稿だったときに、asp.net mvcがエラーページにリダイレクトするのをどのように止めますか?例外が発生したときに設定ファイルのエラーパスにリダイレクトしようとし続け、例外を返す必要があります...また、正しいパスにリダイレクトしようとさえしません-エラーを探し続けます。ホームの下のcshtmlビュー(ホームコントローラーを使用しようとしているように、ビューのホームフォルダー)。すべてがエラーフォルダー/コントローラーのセットアップの下にある場合。これは、構成ファイルに明確に示されています。

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

ありがとう!

4

2 に答える 2

1

これを行うには、Global.asaxにApplication_Errorイベントを登録してから、この方法でデータを含むエラーコントローラーにリダイレクトするか、エラーコードに応じて必要な機能を実行できます。

protected void Application_Error()
        {
            var exception = Server.GetLastError();
            var httpException = exception as HttpException;
            Response.Clear();
            Server.ClearError();
            var routeData = new RouteData();
            routeData.Values["controller"] = "Error";
            routeData.Values["action"] = "oops";
            routeData.Values["exception"] = exception;
            Response.StatusCode = 500;
            if (httpException != null)
            {
                Response.StatusCode = httpException.GetHttpCode();
                switch (Response.StatusCode)
                {
                    case 403:
                        routeData.Values["action"] = "NoAccess";
                        break;
                    case 404:
                        routeData.Values["action"] = "NotFound";
                        break;
                }
            }

            IController errorsController = new ErrorController();
            var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
            errorsController.Execute(rc);
        }

次に、アクションoops / NotAccess/NotFoundのようなコントローラーを作成します

public ActionResult oops(Exception exception)
        {
            //return Content("General failure", "text/plain");

           // return View();

        }

        public ActionResult NotFound()
        {
           // return Content("Not found", "text/plain");
          //  return View("oops");
        }

        public ActionResult NoAccess()
        {
            //return Content("Forbidden", "text/plain");
            //return View("oops");
        }

そして適切な情報であなた自身の見解を返す

于 2012-05-18T20:28:09.947 に答える
0

解決策1:すべてのコントローラーにBASEコントローラーを使用でき(使用することをお勧めします)、このコントローラーでは、次のようにOnExceptionメソッドをオーバーライドできます。

    protected override void OnException(ExceptionContext filterContext)
    {
        if (Request.IsAjaxRequest())
        {
            // TODO
        }
        else
        {
            base.OnException(filterContext);
        }
    }

解決策2:カスタムアクションフィルターを作成して、上記の方法で作業と使用を行うことができます。このフィルターをglobal.asaxに登録するか、必要なコントローラー/アクションのみを装飾することができます。

一般的な考え方は次のとおりです。

Request.IsAjaxRequest()

それが役に立てば幸い。頑張って楽しんでね :)

于 2012-05-18T21:05:25.280 に答える