Tôi biết câu trả lời của tôi là một chút muộn (gần bốn năm) để các trò chơi, nhưng tôi đã xem qua câu hỏi này và muốn chia sẻ một giải pháp mà tôi nghĩ ra, cho phép tôi làm rất nhiều điều mà câu hỏi ban đầu muốn làm, trong trường hợp nó giúp mọi người trong tương lai.
Giải pháp liên quan đến một viên đá quý nhỏ được gọi là AttributeUsage
, cho phép chúng tôi chỉ định thuộc tính trên bộ điều khiển (và thậm chí bất kỳ bộ điều khiển cơ sở nào) và sau đó ghi đè lên (bỏ qua/loại bỏ) trên từng hành động hoặc bộ điều khiển phụ. Chúng sẽ "xếp" xuống đến nơi mà thuộc tính chi tiết nhất thực sự cháy: tức là chúng đi từ các bộ điều khiển cơ sở (cụ thể) đến các bộ điều khiển có nguồn gốc cụ thể hơn (các phương thức hành động).
Đây là cách:
[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
}
(Tôi nghe nói bạn như thuộc tính, vì vậy tôi đặt một số thuộc tính trên thuộc tính Đó là thực sự những gì làm cho công việc kỳ diệu ở đây tại rất đầu: Cho phép họ để kế thừa/tầng, nhưng chỉ cho phép một trong số họ để thực hiện)
Sau đây là cách nó được sử dụng tại:.
[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...
}
tôi hy vọng điều này biên dịch, tôi giật nó từ một số mã tương tự và đã làm một chút s earch và thay thế nó để nó có thể không hoàn hảo.
Cảm ơn David! Chính xác những gì tôi đã có trong tâm trí! –