Вопрос: Как получить все имена действий от контроллера


Как я могу написать код, чтобы получить все имена действий с контроллера в asp.net MVC?

Я хочу автоматически перечислить все имена действий с контроллера.

Кто-нибудь знает как это сделать?

Большое спасибо.


3


источник


Ответы:


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

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


3



Я боролся с этим вопросом какое-то время, и я считаю, что придумал решение, которое должно работать большую часть времени. Это включает в себя получение 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);
}

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


8



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

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

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


2



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


0