2017-12-18 37 views
0

MVCコントローラ(プラグイン/アドオンフレームワーク)のソースとして動的にロードされたアセンブリを使用しています。私は参照されたアセンブリ内のコントローラの属性ルートをマップする方法が見つけられません。参照/外部アセンブリのMapMvcAttributeRoutes

参照されたアセンブリ内でMapMvcAttributeRoutesを呼び出そうとしましたが(Web APIで動作すると思われる記事のように)、動作しませんでした。

参照するアセンブリ内のコントローラの属性ルートをマップするにはどうすればよいですか?

EDIT:

私は、ファイルからアセンブリをロードするメインMVCアプリケーションを持っています。これらのアセンブリは、そのように構成されています。

Add-On Assembly Structure

私はコントローラを作成し、Viewを見つけるためのコードを拡張しますが、私はこのような外部アセンブリ内で指定された(マップ)RouteAttribute Sを処理する方法には何の指示を見つけることができません:

+1

カスタムフレームワークかCMSですか。より良い方法でそれを理解するためにいくつかのコードを表示すると良いでしょう。 –

+0

問題をいくつかのコードで詳しく説明してください。 – inthevortex

答えて

0

私は解決策を見つけることができました。ルート属性を手作業で解析してルート辞書に入れました。おそらく、それを100%の権利をやってますが、これは、これまで動作しているようではない:

public static void MapMvcRouteAttributes(RouteCollection routes) 
{ 
    IRouteHandler routeHandler = new System.Web.Mvc.MvcRouteHandler(); 

    Type[] addOnMvcControllers = 
     AddOnManager.Default.AddOnAssemblies 
      .SelectMany(x => x.GetTypes()) 
      .Where(x => typeof(AddOnWebController).IsAssignableFrom(x) && x.Name.EndsWith("Controller")) 
      .ToArray(); 

    foreach (Type controller in addOnMvcControllers) 
    { 
     string controllerName = controller.Name.Substring(0, controller.Name.Length - 10); 
     System.Web.Mvc.RoutePrefixAttribute routePrefix = controller.GetCustomAttribute<System.Web.Mvc.RoutePrefixAttribute>(); 
     MethodInfo[] actionMethods = controller.GetMethods(); 
     string prefixUrl = routePrefix != null ? routePrefix.Prefix.TrimEnd('/') + "/" : string.Empty; 

     foreach (MethodInfo method in actionMethods) 
     { 
      System.Web.Mvc.RouteAttribute route = method.GetCustomAttribute<System.Web.Mvc.RouteAttribute>(); 

      if (route != null) 
      { 
       routes.Add(
        new Route(
         (prefixUrl + route.Template.TrimStart('/')).TrimEnd('/'), 
         new RouteValueDictionary { { "controller", controllerName }, { "action", method.Name } }, 
         routeHandler)); 
      } 
     } 
    } 
} 

一見、過剰なトリムが実際にちょうどなしの条件で余分な「/」開始時、中、終わりがあることを確認しています。