web-dev-qa-db-ja.com

ASP.NET MVCの「404ページが見つかりません」クエリを処理するキャッチオールルートを作成するにはどうすればよいですか?

すべてをキャッチし、ASP.NET MVCの404ビューにユーザーをバウンスする最終ルートを作成することは可能ですか?

注:IIS設定でこれを設定したくありません。

48
Pure.Krome

自分で答えを見つけました。

Richard Dingwall には、さまざまな戦略を経たすばらしい投稿があります。特にFilterAttributeソリューションが気に入っています。私はウィリー・ニリーの周りに例外を投げるのが好きではないので、それを改善できるかどうかを確認します:)

Global.asaxの場合、登録する最後のルートとしてこのコードを追加するだけです。

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "PageNotFound" }
    );
73
Pure.Krome

この質問は最初に出てきましたが、簡単な答えは後の質問で出てきました。

カスタムASP.NET MVC 404エラーページのルーティング

この記事のビューを返すErrorControllerを作成することで、エラー処理が機能するようになりました。また、global.asaxのルートに「Catch All」を追加する必要がありました。

Web.configにない場合、これらのエラーページにどのように到達するかわかりません。私のWeb.configは以下を指定する必要がありました。

customErrors mode="On" defaultRedirect="~/Error/Unknown"

そして、私も追加しました:

error statusCode="404" redirect="~/Error/NotFound"

お役に立てれば。

とてもシンプルだから、今はこの方法が大好きです。

 <customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
    <error statusCode="404" redirect="~/Error/PageNotFound/" />
 </customErrors>
19
smdrager

また、以下のようにGlobal.asax.csでNOT FOUNDエラーを処理できます。

protected void Application_Error(object sender, EventArgs e)
{
    Exception lastErrorInfo = Server.GetLastError();
    Exception errorInfo = null;

    bool isNotFound = false;
    if (lastErrorInfo != null)
    {
        errorInfo = lastErrorInfo.GetBaseException();
        var error = errorInfo as HttpException;
        if (error != null)
            isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
    }
    if (isNotFound)
    {
        Server.ClearError();
        Response.Redirect("~/Error/NotFound");// Do what you need to render in view
    }
}
6
MSDs

プロジェクトのルートweb.configファイルの下にこの行を追加します。

 <system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
  <remove statusCode="500" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
  <remove name="FormsAuthentication" />
</modules>
4
Vicky

これは使用するときに問題になる可能性があります

throw new HttpException(404);

あなたがそれをキャッチしたいとき、私はあなたのウェブ設定を編集する他の方法を知りません。

3
Paco

キャッチオールルートを作成する代わりに、Application_EndRequestメソッドをMvcApplicationごとに Marco's Better-Than-Unicorns MVC 404 Answer で指定します。

1
Edward Brey

RouterConfig.csの中に、次のコードを追加します。

  routes.MapRoute(
           name: "Error",
           url: "{id}",
           defaults: new
           {
               controller = "Error",
               action = "PageNotFound"

           });
1
solanki dev

ルートを解決できない場合、MVCフレームワークは404エラーを通過します。最良のアプローチは、例外フィルターを使用することです...カスタム例外フィルターを作成し、このようにします。

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}
0
Laxmeesh Joshi