給定動作名稱,控制器名稱和HTTP動詞(GET,POST ..等),是否可以檢查動作是否具有(即通過)特定動作過濾器屬性?如何使用動作和控制器名稱獲取ActionDescriptor
請注意:操作和控制器不是當前操作和控制器,但可以是應用程序中的任何操作和控制器。
謝謝!
給定動作名稱,控制器名稱和HTTP動詞(GET,POST ..等),是否可以檢查動作是否具有(即通過)特定動作過濾器屬性?如何使用動作和控制器名稱獲取ActionDescriptor
請注意:操作和控制器不是當前操作和控制器,但可以是應用程序中的任何操作和控制器。
謝謝!
我不太確定是否明白在哪個地方你想檢查它。如果您正在使用OnActionExecuting或OnActionExecuted。 ActionExecutedContext有財產ActionDescriptor。在那裏您可以找到IsDefined方法,它可以檢查是否爲該成員定義了指定屬性類型的一個或多個實例。檢查的代碼示例波紋管:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
var hasAutorizeAttr = filterContext.ActionDescriptor
.IsDefined(typeof(AuthorizeAttribute), false);
base.OnActionExecuted(filterContext);
}
編輯: OK,現在我明白你的問題。看起來沒有優雅的解決方案。如果你需要在AjaxExtensions.BeginForm方法中玩別人動作檢查,我只能看到一種方法 - 反思。但在我看來,在這種情況下你需要重新考慮你的架構。
我已經回答了我自己的問題,這與此非常相似。
您還需要http method
(即GET,POST),以得到正確的結果,除了動作和控制器的名稱。
這是一塊解決您的問題代碼:
var controllerFactory = ControllerBuilder.Current
.GetControllerFactory();
var controllerContext = @this.ControllerContext;
var otherController = (ControllerBase)controllerFactory
.CreateController(
new RequestContext(controllerContext.HttpContext, new RouteData()),
controllerName);
var controllerDescriptor = new ReflectedControllerDescriptor(
otherController.GetType());
var controllerContext2 = new ControllerContext(
new MockHttpContextWrapper(
controllerContext.HttpContext.ApplicationInstance.Context,
method),
new RouteData(),
otherController);
var actionDescriptor = controllerDescriptor
.FindAction(controllerContext2, actionName);
我有地方,我需要檢查,如果一個動作有一個自定義屬性類似的問題。
public static IEnumerable<MyCustomAttribute> GetAttributes(string controllerName, string actionName)
{
var types = Assembly.GetExecutingAssembly().GetTypes();
var controllers = types.Where(t => (t.Name == controllerName));
var action = controllers.SelectMany(type => type.GetMethods().Where(a => a.Name == actionName)).FirstOrDefault();
return action.GetCustomAttributes<MyCustomAttribute>(true);
}
謝謝您的回答,但正如我在我的問題提到的,我不是來檢查當前正在執行的行動ActionDescriptor。我將檢查AjaxHelper擴展方法,特別是Ajax.BeginForm()的額外重載,並且我希望能夠檢查BeginForm()中指定的操作名稱是否具有特定屬性。 – dev99 2012-07-19 05:10:57
檢查我的編輯答案。 – RredCat 2012-07-19 07:55:41