Как написать код, чтобы получить все имена действий с контроллера в asp.net MVC?Как получить все имена действий от контроллера
Я хочу автоматически перечислить все имена действий с контроллера.
Кто-нибудь знает, как это сделать?
Большое спасибо.
Как написать код, чтобы получить все имена действий с контроллера в asp.net MVC?Как получить все имена действий от контроллера
Я хочу автоматически перечислить все имена действий с контроллера.
Кто-нибудь знает, как это сделать?
Большое спасибо.
Для этого нет никакого общего решения, поскольку я мог бы написать собственный атрибут, полученный из ActionNameSelectorAttribute
, и переопределить с любым пользовательским кодом, даже кодом, который сравнивает имя с случайным идентификатором GUID. В этом случае вы не должны знать, какое действие будет принимать атрибут.
Если ограничить свое решение только с учетом имени методы или встроенный ActionNameAttribute
то вы можете подумать над классом, чтобы получить все имена общедоступных методов, которые возвращают ActionResult
и проверить, есть ли они в ActionNameAttribute
которого Name
недвижимости переопределяет имя метода.
Использование Reflection, было бы очень хорошим местом для начала.
Вы можете начать с:
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;
}
Вам придется работать больше, чтобы удовлетворить ваши потребности.
Благодарим вас за предоставленный пример для меня. Это очень полезно. –
Я занимаюсь этим вопросом какое-то время, и я считаю, что придумал решение, которое должно работать большую часть времени. Он включает в себя получение 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);
}
Есть, вероятно, больше фильтров, которые нужно искать, но на данный момент это соответствует моим потребностям.
Не могли бы вы привести мне простой пример? –