Как получить все имена действий от контроллера - PullRequest
3 голосов
/ 28 октября 2009

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 07 сентября 2011

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

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

3 голосов
/ 28 октября 2009

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

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

2 голосов
/ 28 октября 2009

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

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 голосов
/ 28 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...