1

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

如果有人可以提供帮助,我将不胜感激。谢谢

4

2 回答 2

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");

从中您可以轻松获取使用反射应用的操作或任何属性。

希望这可以帮助某人。

于 2012-07-20T12:35:00.160 回答
0

作为@nfplee 解决方案,您可以按区域和控制器名称获取控制器,但请记住它可能会返回 Sequence contains no matching element异常,除非您在注册路由中提到正确的命名空间。与 RegisterArea 方法中的任何区域一样,将命名空间添加到 RouteConfig 中的主 registerroutes。

希望这是有用的。

祝你好运。

于 2013-02-07T08:23:52.950 回答