ASP.NET MVC - 获取调用的操作属性

时间:2012-07-19 20:26:00

标签: asp.net-mvc asp.net-mvc-routing

给定一个动作名称和控制器的字符串以及路由值的RouteValueDictionary如何返回应用于应该调用的动作的任何属性?

如果有人可以提供帮助,我会很感激。感谢

2 个答案:

答案 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方法中的任何区域一样。

希望这很有用。

祝你好运。