2009-10-28 2 views

ответ

3

Для этого нет никакого общего решения, поскольку я мог бы написать собственный атрибут, полученный из ActionNameSelectorAttribute, и переопределить с любым пользовательским кодом, даже кодом, который сравнивает имя с случайным идентификатором GUID. В этом случае вы не должны знать, какое действие будет принимать атрибут.

Если ограничить свое решение только с учетом имени методы или встроенный ActionNameAttribute то вы можете подумать над классом, чтобы получить все имена общедоступных методов, которые возвращают ActionResult и проверить, есть ли они в ActionNameAttribute которого Name недвижимости переопределяет имя метода.

+0

Не могли бы вы привести мне простой пример? –

0

Использование Reflection, было бы очень хорошим местом для начала.

2

Вы можете начать с:

Type t = typeof(YourControllerType); 
MethodInfo[] mi = t.GetMethods(); 
foreach (MethodInfo m in mi) 
{ 
    if (m.IsPublic) 
     if (typeof(ActionResult).IsAssignableFrom(m.ReturnParameter.ParameterType)) 
      methods = m.Name + Environment.NewLine + methods; 
} 

Вам придется работать больше, чтобы удовлетворить ваши потребности.

+0

Благодарим вас за предоставленный пример для меня. Это очень полезно. –

8

Я занимаюсь этим вопросом какое-то время, и я считаю, что придумал решение, которое должно работать большую часть времени. Он включает в себя получение ControllerDescriptor для рассматриваемого контроллера, а затем проверку каждого ActionDescriptor, возвращенного ControllerDescriptor.GetCanonicalActions().

Я закончил тем, что сделал частичное представление в моем контроллере, но я думаю, что довольно легко понять, что происходит, поэтому не стесняйтесь принимать код и изменять его в соответствии с вашими потребностями.

[ChildActionOnly] 
public ActionResult Navigation() 
{ 
    // List of links 
    List<string> NavItems = new List<string>(); 

    // Get a descriptor of this controller 
    ReflectedControllerDescriptor controllerDesc = new ReflectedControllerDescriptor(this.GetType()); 

    // Look at each action in the controller 
    foreach (ActionDescriptor action in controllerDesc.GetCanonicalActions()) 
    { 
     bool validAction = true; 

     // Get any attributes (filters) on the action 
     object[] attributes = action.GetCustomAttributes(false); 

     // Look at each attribute 
     foreach (object filter in attributes) 
     { 
      // Can we navigate to the action? 
      if (filter is HttpPostAttribute || filter is ChildActionOnlyAttribute) 
      { 
       validAction = false; 
       break; 
      } 
     } 

     // Add the action to the list if it's "valid" 
     if (validAction) 
      NavItems.Add(action.ActionName); 
    } 

    return PartialView(NavItems); 
} 

Есть, вероятно, больше фильтров, которые нужно искать, но на данный момент это соответствует моим потребностям.

Смежные вопросы