MVCアクションを取得して404を返す方法


142

一部のデータを取得するために使用される文字列を取得するアクションがあります。この文字列によってデータが返されない場合(おそらく削除されているため)、404を返してエラーページを表示します。

私は現在、アイテムが見つからなかったというこのアクションに固有のわかりやすいエラーメッセージを表示する特別なビューを返すだけを使用しています。これは正常に機能しますが、理想的には404ステータスコードを返したいので、検索エンジンはこのコンテンツが存在しないことを認識し、検索結果から削除できます。

これに対処する最良の方法は何ですか?

Response.StatusCode = 404を設定するのと同じくらい簡単ですか?


また、Response.TrySkipIisCustomErrors = trueを維持する必要があります。@gandersの答えは命の恩人でした...
サンダー

回答:


111

それには複数の方法があります。

  1. あなたは指定された方法で割り当てることができる共通のaspxコードで正しいです
  2. throw new HttpException(404, "Some description");

1
注意すべきことの1つは、404を処理するように設定されたcustomErrorページがある場合、このエラーページは200を返します(見つからないページが見つかりました... :-()。たとえば、BlogControllerから例外をスローする傾向がありますNotFoundアクションに適切な応答コードを設定させます
Nigel Sampson、

20
結局、次のようにしました。Response.TrySkipIisCustomErrors = true; View( "MyCustomView");を返します。これは私の状況では完全に機能します。
Paul Hiles

@PaulHiles:これは、MVC3での私に対する答えです。コメントではなく回答として賛成できることを願っています。
Valamas 2014

IISを使用している場合、これは機能しないと思います。で私のテストサイトでは、それは罰金を動作しますが、ライブサイト上でカスタムエラーページキック。
アンディ・ブラウン

@AndyBrown IISとIIS Expressの両方で機能します。IIS(管理コンソール)の構成を確認する必要があります
Dewfy

150

ASP.NET MVC 3 以降では、コントローラーからHttpNotFoundResultを返すことができます。

return new HttpNotFoundResult("optional description");

4
使用法:return new HttpNotFoundResult("optional description");
Valamas 2015年

6
コントローラ内から戻る場合は、という便利なメソッドもありHttpNotFound()ます。したがって、return HttpNotFound("optional description")代わりに戻ることができます。
Luis Perez

1
2012年には物事はそれほど便利ではありませんでした;-)
Stefan Paul

61

MVC 4以降では、組み込みのHttpNotFoundヘルパーメソッドを使用できます。

if (notWhatIExpected)
{
    return HttpNotFound();
}

または

if (notWhatIExpected)
{
    return HttpNotFound("I did not find message goes here");
}

26

コード:

if (id == null)
{
  throw new HttpException(404, "Your error message");//RedirectTo NoFoundPage
}

Web.config

<customErrors mode="On">
  <error statusCode="404" redirect="/Home/NotFound" />
</customErrors>

また、利用可能なすべてのステータスコードは、この列挙型HttpStatusCodeにあります。
user2173353 2014年

12

私はこれを使用しました:

Response.StatusCode = 404;
return null;

ありがとうございました。これは、サーバーで高価な例外をスローするよりもはるかによく見えます。404がIISログに記録されるかどうか疑問に思います...理想的にはそうです。
fozylet、2012年

1
しかし、asp.netでは、この方法は適切な解決策ではありませんよね?Webページにはサーバーのすべての関連する機密情報が表示されるためです。
lzlstyle 2013年

1
1つの例外の処理にかかる時間は1ミリ秒未満です。HTTP接続を確立してバックアップするだけの数百ミリ秒と比較すると、意味がありません。HttpExceptionをスローするかHttpNotFoundResultを返し、手動でステータスコードを設定してnullを返すのはひどいです。
George


5

NerdDinnerで やっみる

public ActionResult Details(int? id) {
    if (id == null) {
        return new FileNotFoundResult { Message = "No Dinner found due to invalid dinner id" };
    }
    ...
}

ありがとう、ただし裏では、Dewfyの投稿の提案2と同様のHttpExceptionがスローされます。コントローラー/グローバル404ページにリダイレクトするだけでなく、アクションに固有の素敵なエラーページを表示できるように、もう少しコントロールを探しています。状況コードを設定してカスタムビューに戻ることが私の状況に進む方法のように見えます。
Paul Hiles

4

以下の中央の行を追加するまで、上記の例はどれもうまくいきませんでした。

public ActionResult FourOhFour()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; // this line made it work
    return View();
}

2
シンプルでreturn HttpNotFound();はうまくいかなかったと真剣に言っていますか?システムは何歳ですか?
2014年

1
やってみましたreturn HttpNotFound();か?MVC 4以上で問題なく動作します。msdn.microsoft.com/en-us/library/… "TrySkipIisCustomErrorsプロパティは、アプリケーションがIIS 7.0でホストされている場合にのみ使用されます。IIS7.0でクラシックモードで実行されている場合、TrySkipIisCustomErrorsプロパティのデフォルト値はtrueです。統合モードで実行されている場合、TrySkipIisCustomErrorsプロパティのデフォルト値はfalseです。」
コーディング終了

2

私が使う:

Response.Status = "404 NotFound";

これは私にとってはうまくいきます:-)




-1

次のデモコードをお試しください。

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.