14

カスタム例外のみを処理するためにカスタム HandleErrorAttribute を使用する MVC 4 アプリがあります。デフォルトの 404 およびその他の 500 以外のエラー ページを傍受して、より魅力的なページに置き換えたいと考えています。そのために、Web.config に以下を追加しました。

<system.web>
    <customErrors mode="On" defaultRedirect="~/Error/Index" />
...
</ system.web>

Index メソッドと対応するビューを備えたエラー コントローラーがありますが、それでも既定の 404 エラー ページが表示されます。また、自分defaultRedirectを静的なhtmlファイルに設定しようとしましたが、役に立ちませんでした。404 の inside に固有のエラー処理を追加しようとしまし<customErrors>たが、プログラムでルートを変更しようとしましたが、すべて結果がありませんでした。私は何が欠けていますか?ASP が既定のエラー処理を無視するのはなぜですか?

注: CustomHandleErrorAttribute を使用してもローカルでテストできないことに以前に気付きました<customErrors mode="On"。ただし、開発ボックスからサーバーでヒットすると機能します...それが関連しているかどうかはわかりません。 この人も同じ問題を抱えていました。

4

6 に答える 6

14

これはうまくいくはずです:

1.Web.Config

<customErrors mode="On"
   defaultRedirect="~/Views/Shared/Error.cshtml">

  <error statusCode="403"
    redirect="~/Views/Shared/UnauthorizedAccess.cshtml" />

  <error statusCode="404"
    redirect="~/Views/Shared/FileNotFound.cshtml" />

</customErrors>

2. 次のように、FilterConfig クラスにグローバル アクション フィルターとして HandleErrorAttribute を登録します。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomHandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
    }

それでもうまくいかない場合は、Global.asax の次のようなステータス コードを確認して、応答を自分で転送してみてください: 少なくとも動作する必要があります。

void Application_EndRequest(object sender, EventArgs e)
{
    if (Response.StatusCode == 401)
    {
        Response.ClearContent();
        Server.Transfer("~/Views/Shared/UnauthorizedAccess.cshtml");
    }
}
于 2013-07-17T04:24:36.697 に答える
0

Controller ErrorController を作成します。

 public class ErrorController : Controller
    {
        //
        // GET: /Error/

        public ActionResult Index()
        {
            return View();
        }
}

アクションのインデックス ビューを作成します。

Web.config で

<customErrors mode="On">
      <error statusCode="404" redirect="Error/Index"/>
</customErrors>

コード/ロジックでエラーを処理しているとき

[HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start application.";

            return View("Index2");
        }
}

[HandleError] 属性 - 共有フォルダー内の Error.cshtml ページにリダイレクトされます。

于 2013-07-14T06:48:30.757 に答える
0

この回答が役立つかどうかはわかりませんが、これは簡単な方法です... error.html を / に配置し、Web 構成でカスタムエラーのモードをオンにすると、これは完全に機能します...

  <system.web>
    <customErrors defaultRedirect="~/Error.html" mode="On" />
  </system.web>

この error.html は、head と body を持つ基本的な html ページです。

于 2013-07-22T12:56:44.993 に答える