ASP.NET MVCには、このような属性
HandleErrorAttributeがあり、MSDNで述べられているように、
アクションメソッドによって発生した例外の処理に使用される属性を表します。
しかし、どこでも、同じMSDNでは、サーバー応答コードを500に設定する例外のみを処理することは言われていません(
私があなたの鼻で突いて 、それが書かれているリンクを与えてください)。
HandleErrorAttributeのソースコードを確認するの
HandleErrorAttribute簡単です。 次の行があります。
私はあなたについては知りませんが、例外が発生すると、ユーザーが「死の黄色いページ」ではなく、サーバー応答コード(Web.configの設定によって異なります)後で詳しく説明します)。
独自のAnalog HandleErrorAttribute作成
そのため、標準の
HandleErrorAttributeは私たちに合わないことがわかったので、独自に作成してみましょう。
もちろん、
IExceptionFilterインターフェイスから継承するクラスを作成できますが、一般に、すべての例外を処理した場合の標準
HandleErrorAttribute動作に満足しています。 そして、ほとんどすべてが私たちに合っているので、クラスは私たちにとって好ましくない
HandleErrorAttributeから継承します。
public class HandleAllErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); }
まず、これは
HandleErrorAttributeを確認する
HttpStatusCodeを除いて、これが標準の
HandleErrorAttributeコードであると
HttpStatusCodeます。
実際に彼がしていること:
- 入力パラメーターの妥当性をチェックします
customErrorsがcustomErrorsかどうかを確認しますHandleErrorInfoクラスにHandleErrorInfoをHandleErrorInfoしHandleErrorInfo- 新しい
ViewResult作成し、データで塗りつぶし、現在の代わりに割り当てます - サーバーエラーをクリアし、サーバー応答コードを設定します
クラスの準備ができました。次に、標準属性を自分のものに置き換えます。 すべてのコントローラーまたはコントローラーアクションに書き込まないように、グローバルフィルターを使用してこれを行います。 この場合、これは重要ではありませんが、実際には便利です。 したがって、
Global.asax.csに移動し、作成したばかりの属性である標準フィルターの代わりに設定します。
filters.Add(new HandleAllErrorAttribute());
テスト
ここで、フィルターが機能し、必要なデータが
View渡されることを確認するために
、標準の
〜/ Views / Shared / Error.cshtmlをわずかに変更します。
@model System.Web.Mvc.HandleErrorInfo @{ ViewBag.Title = "Error"; } <h2> Sorry, an error occurred while processing your request. </h2> <h3>@Model.Exception.Message</h3>
そして、ルートにある
Web.configの
System.Webセクションに次の行を追加します。
<customErrors mode="On" defaultRedirect="Error" />
この行を使用して、カスタムエラー処理、より正確にはカスタムエラーページを有効にします。
ここで、例外を発生させる必要があります。これは、スタジオが作成した標準コントローラーのアクションで行います。
public ActionResult About() { throw new HttpException(403, " !"); return View(); }
それだけです! プロジェクトを開始し、「About」セクションに移動して、属性が正しく機能したことを確認します。
