2012-07-18 64 views
6

給定動作名稱,控制器名稱和HTTP動詞(GET,POST ..等),是否可以檢查動作是否具有(即通過)特定動作過濾器屬性?如何使用動作和控制器名稱獲取ActionDescriptor

請注意:操作和控制器不是當前操作和控制器,但可以是應用程序中的任何操作和控制器。

謝謝!

回答

0

我不太確定是否明白在哪個地方你想檢查它。如果您正在使用OnActionExecutingOnActionExecutedActionExecutedContext有財產ActionDescriptor。在那裏您可以找到IsDefined方法,它可以檢查是否爲該成員定義了指定屬性類型的一個或多個實例。檢查的代碼示例波紋管:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    var hasAutorizeAttr = filterContext.ActionDescriptor 
          .IsDefined(typeof(AuthorizeAttribute), false); 
    base.OnActionExecuted(filterContext); 
} 

編輯: OK,現在我明白你的問題。看起來沒有優雅的解決方案。如果你需要在AjaxExtensions.BeginForm方法中玩別人動作檢查,我只能看到一種方法 - 反思。但在我看來,在這種情況下你需要重新考慮你的架構。

+0

謝謝您的回答,但正如我在我的問題提到的,我不是來檢查當前正在執行的行動ActionDescriptor。我將檢查AjaxHelper擴展方法,特別是Ajax.BeginForm()的額外重載,並且我希望能夠檢查BeginForm()中指定的操作名稱是否具有特定屬性。 – dev99 2012-07-19 05:10:57

+0

檢查我的編輯答案。 – RredCat 2012-07-19 07:55:41

4

我已經回答了我自己的問題,這與此非常相似。

您還需要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); 
0

我有地方,我需要檢查,如果一個動作有一個自定義屬性類似的問題。

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); 
    } 

感謝this SO answer

相關問題