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、Register Routesで適切な名前空間について言及している場合を除き、例外が返される場合があることに注意してください。RegisterAreaメソッドの任意の領域と同様に、RouteConfigのメインのregisterrouteに名前空間を追加します。

これがお役に立てば幸いです。

幸運を。

于 2013-02-07T08:23:52.950 に答える