给定一个动作名称和控制器的字符串以及路由值的RouteValueDictionary如何返回应用于应该调用的动作的任何属性?
如果有人可以提供帮助,我会很感激。感谢
答案 0 :(得分:0)
我设法提出以下内容:
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");
通过它,您可以轻松获取使用反射应用的操作或任何属性。
希望这可以帮助某人。
答案 1 :(得分:0)
作为@nfplee解决方案,您可以按区域和控制器名称获取控制器,但记住它可能会返回Sequence contains no matching element
异常,除非您在注册路由中提及正确的命名空间。将名称空间添加到RouteConfig中的主寄存器路由,就像RegisterArea方法中的任何区域一样。
希望这很有用。
祝你好运。