2009-03-23 16 views
1

私が開発しようとしているアプリケーションのフィルタの1つが、ユーザーが変更しようとしている項目を所有しているかどうかを確認します。アクションは[RequiresOwnership]属性で装飾され、属性ロジック内ではユーザーがアイテムを所有しているかどうかを確認し、そうでなければUnauthorizedAccessExceptionを投げます。.NETのMVCでフィルタによってスローされた例外をキャッチする方法はありますか?

私の質問は次のとおりです。その例外をどこで捕まえることができますか?私は理想的には、例外ページを表示するのではなく、何をしようとしたのか許可されていない理由を説明するページにリダイレクトするのが理想的です。私は、属性によって装飾されたアクションの中で例外をキャッチするとは思わないので、.NET MVCモデルで上位にスローされた例外を処理できるアプリケーションの基本部分がありますか?

編集:フィルタ自体を介してページにリダイレクトすることはできますが、それは私にはちょっとハッキリなようです。属性を介して例外をスローするといいかもしれませんし、キャッチして処理できる標準的な場所が1つあります。

答えて

2

コントローラの[HandleError]属性は、エラーハンドラビューへのオプションのパスをとります。デフォルトは〜/ Views/Shared/Error.aspxです。そこにあなたの特定の例外の追加サポートを追加することができます。

0

私はこの問題を抱えていました。私が解決したのは、例外をスローする代わりにFilterContextのTempDataコレクションに追加することでした。あなたは、その後、あなたのアクションメソッドでそれをチェックし、それを再スローし、適切に対処することができます

属性では:

if (/*some error condition*/) 
    filterContext.Controller.TempData["Err"] = new Exception("An error"); 

とアクションメソッドで:

var e = TempData["Err"] as Exception; 
if (e != null) 
    throw e; 

にです理想的なソリューションではありませんが、前述したように、属性から例外をキャッチする便利な場所はありません。

+0

*「属性から例外をキャッチするのに便利な場所はありません」* @ GalacticCowboyの答えには何が間違っていますか? – seebiscuit

関連する問題