ページに404エラーを返させるために、次の2つのことを試しました。
public ActionResult Index()
{
return new HttpStatusCodeResult(404);
}
public ActionResult NotFound()
{
return HttpNotFound();
}
ただし、どちらも空白のページをレンダリングするだけです。 ASP.NET MVC 3内から404エラーを手動で返すにはどうすればよいですか?
フィドラーを使用して応答を調べると、空白ページが実際に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>
セクションに置き換えられています。
私はこれを正常に使用しています:
return new HttpNotFoundResult();
throw new HttpException(404, "NotFound");
とともに カスタムエラーハンドラ が正常に機能します。
あなたが使用する必要があります
// 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);
404結果をパーソナライズできます
return new HttpStatusCodeResult(404, "My message");