web-dev-qa-db-ja.com

404エラーASP.NET MVC 3を返す

ページに404エラーを返させるために、次の2つのことを試しました。

public ActionResult Index()
{
    return new HttpStatusCodeResult(404);
}

public ActionResult NotFound()
{
    return HttpNotFound();
}

ただし、どちらも空白のページをレンダリングするだけです。 ASP.NET MVC 3内から404エラーを手動で返すにはどうすればよいですか?

30
ryanzec

フィドラーを使用して応答を調べると、空白ページが実際に404ステータスコードを返していることがわかります。問題は、ビューがレンダリングされていないため、空白ページが表示されることです。

代わりに、特定のステータスコードが発生したときにユーザーを特定のURLにリダイレクトするcustomErrors要素をweb.configに追加することにより、実際のビューを表示することができます。以下にウォークスルーを示します。

必要に応じて、最初に HttpException をスローします。例外をインスタンス化するときは、httpステータスコードを以下のようなパラメーターとして受け取るオーバーロードのいずれかを必ず使用してください。

throw new HttpException(404, "NotFound");

次に、上記の例外が発生したときにレンダリングするビューを決定できるように、web.configファイルにカスタムエラーハンドラーを追加します。以下に例を示します。

<configuration>
    <system.web>
        <customErrors mode="On">
          <error statusCode="404" redirect="~/404"/>
        </customErrors>
    </system.web>
</configuration>

ここで、「404」というURLを処理するGlobal.asaxにルートエントリを追加します。このエントリは、404ページのビューを表示するコントローラーのアクションにリクエストを渡します。

Global.asax

routes.MapRoute(
    "404", 
    "404", 
    new { controller = "Commons", action = "HttpStatus404" }
);

CommonsController

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

あとは、上記のアクションのビューを追加するだけです。

上記の方法に関する注意点:「C#2010のPro ASP.NET 4」(Apress)によると、 customErrors の使用は時代遅れです'IIS 7.を使用しています。代わりに、 httpErrors セクションを使用する必要があります。本からの引用は次のとおりです。

ただし、この設定はVisual Studioの組み込みのテストWebサーバーで引き続き機能しますが、IIS 7.xの<httpErrors>セクションに置き換えられています。

63
xTRUMANx

私はこれを正常に使用しています:

return new HttpNotFoundResult();
17
MartinHN

throw new HttpException(404, "NotFound");とともに カスタムエラーハンドラ が正常に機能します。

15
Darin Dimitrov

あなたが使用する必要があります

// returns 404 Not Found as EmptyResult() which is suitable for ajax calls
return new HttpNotFoundResult();

AJAX=コントローラへの呼び出しを行い、コンテンツが見つからない場合。

コントローラーアクションへの古典的な呼び出しを行い、ビューを返す場合、以下を使用する必要があります。

// throwing new exception returns 404 and redirects to the view defined in web.config <customErrors> section
throw new HttpException(404, ExceptionMessages.Error_404_ContentNotFound);
6
mare

404結果をパーソナライズできます

return new HttpStatusCodeResult(404, "My message");
2
rdelcoig