Учитывая строку для имени действия и контроллера и RouteValueDictionary для значений маршрута, как мне вернуть любые атрибуты, примененные к действию, которое должно быть вызвано?
Я был бы признателен, если бы кто-то мог помочь. Спасибо
Учитывая строку для имени действия и контроллера и RouteValueDictionary для значений маршрута, как мне вернуть любые атрибуты, примененные к действию, которое должно быть вызвано?
Я был бы признателен, если бы кто-то мог помочь. Спасибо
Type.GetType(<yourcontrollerName>).GetMethods().Where(m => m.Name == <yourActionName>).Attributes
предоставит вам все атрибуты действий, соответствующих имени в контроллере. Вы должны быть в состоянии получить правильное действие (говоря, что у вас есть два метода с одинаковыми именами, один для GET, один для POST), играя с ключами/значениями RouteValueDictionary... Немного больше контекста должно помочь. 20.07.2012 Мне удалось придумать следующее:
protected IList<string> GetNamespaces(string area, RouteCollection routes) {
return routes.OfType<Route>()
.Where(r => r.DataTokens != null)
.Where(r => (string.IsNullOrEmpty(area) && r.DataTokens["area"] == null) ||
(r.DataTokens["area"] != null && r.DataTokens["area"].ToString() == area))
.SelectMany(r => (IEnumerable<string>)r.DataTokens["Namespaces"])
.Distinct()
.ToList();
}
public IList<Type> GetControllerTypes() {
// Note you may wish to improve this to select from all the referenced assemblies aswell
return Assembly.GetExecutingAssembly().GetExportedTypes()
.Where(t => typeof(IController).IsAssignableFrom(t) && !t.IsAbstract)
.ToList();
}
public Type GetControllerType(string controller, string area) {
// Get the namespaces for the area
var namespaces = GetNamespaces(area, RouteTable.Routes);
// Return the controller type that matches a namespace and controller name
return GetControllerTypes()
.Single(t => t.Name == controller + "Controller"
&& namespaces.Any(n => n == t.Namespace));
}
Теперь вам просто нужно сказать следующее, чтобы получить тип:
var type = GetControllerType("Admin", "Blog");
Из этого вы можете легко получить действие или любые атрибуты, применяемые с помощью отражения.
Надеюсь, это может помочь кому-то.
В качестве решения @nfplee вы можете получить контроллер по области и имени контроллера, но помните, что он может возвращать исключение Sequence contains no matching element
, если только вы не укажете правильное пространство имен в «Регистрация маршрутов». Добавьте пространство имен к основным регистровым маршрутам в RouteConfig так же, как и к любым областям в методе RegisterArea.
Надеюсь, это полезно.
Удачи.