アクション名とコントローラーの文字列とルート値の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
、Register Routesで適切な名前空間について言及している場合を除き、例外が返される場合があることに注意してください。RegisterAreaメソッドの任意の領域と同様に、RouteConfigのメインのregisterrouteに名前空間を追加します。
これがお役に立てば幸いです。
幸運を。