给定动作名称和控制器的字符串以及路由值的 RouteValueDictionary 我如何返回应用于应该调用的动作的任何属性?
如果有人可以提供帮助,我将不胜感激。谢谢
给定动作名称和控制器的字符串以及路由值的 RouteValueDictionary 我如何返回应用于应该调用的动作的任何属性?
如果有人可以提供帮助,我将不胜感激。谢谢
我设法想出了以下几点:
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
异常,除非您在注册路由中提到正确的命名空间。与 RegisterArea 方法中的任何区域一样,将命名空间添加到 RouteConfig 中的主 registerroutes。
希望这是有用的。
祝你好运。