私は私の答えは、ゲームに(ほぼ4年)少し遅れているけど、私はこの質問に出くわしました私が考案した解決策を共有したいと思っていました。これは、元の質問が今後どのような人に役立つかについて、何をしたいのかとほとんど変わりません。
ソリューションは、必要に応じて、私たちは、個々のアクションまたはサブコントローラ上で(無視する/削除)(!とでも任意の塩基コントローラ)コントローラの属性を指定して上書きすることができますAttributeUsage
と呼ばれる小さな宝石を伴います。最も細分化されたアトリビュートのみが実際に起動する場所、つまり、最小限の固有の(ベースコントローラ)から、より特定の(派生したコントローラへ)、最も特定の(アクションメソッド)まで、「カスケード」します。
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, Inherited=true, AllowMultiple=false)]
public class MyCustomFilterAttribute : ActionFilterAttribute
{
private MyCustomFilterMode _Mode = MyCustomFilterMode.Respect; // this is the default, so don't always have to specify
public MyCustomFilterAttribute()
{
}
public MyCustomFilterAttribute(MyCustomFilterMode mode)
{
_Mode = mode;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (_Mode == MyCustomFilterMode.Ignore)
{
return;
}
// Otherwise, respect the attribute and work your magic here!
//
//
//
}
}
public enum MyCustomFilterMode
{
Ignore = 0,
Respect = 1
}
(私は属性のようにあなたを聞いたので、私は属性にいくつかの属性を置くことは非常に先頭にここに魔法の仕事を作るものは本当にです:
はここにどのようにだ!彼らは/カスケードを継承できるように、しかし、それらの一方のみが実行できるようにする)
ここではそれが使用されるようになりました方法は次のとおりです。
[MyCustomFilter]
public class MyBaseController : Controller
{
// I am the application's base controller with the filter,
// so any derived controllers will ALSO get the filter (unless they override/Ignore)
}
public class HomeController : MyBaseController
{
// Since I derive from MyBaseController,
// all of my action methods will also get the filter,
// unless they specify otherwise!
public ActionResult FilteredAction1...
public ActionResult FilteredAction2...
[MyCustomFilter(Ignore)]
public ActionResult MyIgnoredAction... // I am ignoring the filter!
}
[MyCustomFilter(Ignore)]
public class SomeSpecialCaseController : MyBaseController
{
// Even though I also derive from MyBaseController, I can choose
// to "opt out" and indicate for everything to be ignored
public ActionResult IgnoredAction1...
public ActionResult IgnoredAction2...
// Whoops! I guess I do need the filter on just one little method here:
[MyCustomFilter]
public ActionResult FilteredAction1...
}
、私はいくつかの類似したコードからそれをヤンクし、少しのをやった、これはコンパイルを願ってearch-and-replaceで完璧ではないかもしれません。
ありがとうDavid!まさに私が思いついたこと! –