オプション1:
「不明」ビューとともに「NotFound」ビューを使用してエラーコントローラを構築することです。これにより、500サーバーエラーまたは404 NotFoundエラーが発生し、適切なURLにリダイレクトされます。訪問者は常にエラーページにリダイレクトされるため、このソリューションが完全に気に入っているわけではありません。
http://example.com/Error/Unknown
<customErrors mode="On" defaultRedirect="Error/Unknown">
<error statusCode="404" redirect="Error/NotFound" />
<error statusCode="500" redirect="Error/Unknown" />
</customErrors>
- wwwroot /
- コントローラー
- ビュー/
- エラー/
- NotFound.aspx
- Unknown.aspx
オプション2:
私は間違いなくこの方法を好みません(基本的にWebフォームに戻るため、2番目のオプションは静的なError.aspxページを用意し、MVCのルートを無視することです)が、それでも機能します。ここで行っているのは、「静的」ディレクトリを無視し、そこに物理的なエラーページを配置し、MVCを回避することです。
routes.IgnoreRoute("/Static/{*pathInfo}"); //This will ignore everything in the "Static" directory
オプション3:
3番目のオプション(これは私のお気に入りです)は、エラーをキャッチしているビューからエラービューを返すことです。これには、「既知の」エラーの途中でTry / Catchブロックをコード化する必要があります。その後、忍び寄る可能性のある未知のエラーに対してHandleErrorを使用できます。これにより、最初に要求されたURLは保持されますが、エラービューが返されます。
例: http : //example.com/Products/1234は、ProductID 1234の詳細ページを表示します
http://example.com/Products/9999は、ProductID 9999が存在しないため、NotFoundエラーページを表示しますhttp:// example .com / Errors / NotFoundは、コントローラーでこれらのエラーを個別に処理するため、表示されるべきではありません。
Web.Config
<customErrors mode="On">
</customErrors>
コントローラ
// Use as many or as few of these as you need
[HandleError(ExceptionType = typeof(SqlException), View = "SqlError")]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "NullError")]
[HandleError(ExceptionType = typeof(SecurityException), View = "SecurityError")]
[HandleError(ExceptionType = typeof(ResourceNotFoundException), View = "NotFound")]
Public Class ProductController: Controller{
public ViewResult Item(string itemID)
{
try
{
Item item = ItemRepository.GetItem(itemID);
return View(item);
}
catch()
{
return View("NotFound");
}
}
}
フォルダ構造
- wwwroot /
- コントローラー/
- 共有/
- NotFound.aspx
- NullError.aspx
- SecurityError.aspx
- SqlError.aspx
- ビュー/
オプション4:
最後のオプションは、のようなもののために独自のカスタムフィルタを作成し、ResourceNotFoundException
それをコントローラクラスにアタッチすることです。これは上記とまったく同じことを行いますが、エラーコードをクライアントに送信するという追加の利点もあります。
RichardDingwallが彼のブログでそれについて語っています。