52

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

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

4

8 に答える 8

79

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

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

global.asax については、次のコードを登録する最後のルートとして追加するだけです。

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "PageNotFound" }
    );
于 2008-11-22T00:38:32.987 に答える
20

この質問が最初に来ましたが、より簡単な答えは後の質問にありました。

カスタム 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>
于 2011-09-21T14:47:36.580 に答える
7

また、以下のように 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
    }
}
于 2016-03-06T11:06:27.967 に答える
3

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

throw new HttpException(404);

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

于 2008-11-22T19:46:01.737 に答える
1

キャッチオールルートを作成する代わりに、MarcoのBetter-Than-Unicorns MVC404AnswerにメソッドApplication_EndRequestを追加することもできます。MvcApplication

于 2012-08-24T21:02:09.967 に答える