2017-12-18 4 views
0

Ich verwende dynamisch geladene Assemblys als Quelle für MVC-Controller (Plugin/Add-On-Framework). Ich kann keine Möglichkeit finden, die Attributrouten für die Controller in der referenzierten Assembly zuzuordnen.MapMvcAttributeRoutes in referenzierter/externer Assembly

Ich versuchte, MapMvcAttributeRoutes aus der referenzierten Assembly aufrufen (wie auf Artikel vorgeschlagen, würde in Web-API funktionieren), aber das hat nicht funktioniert.

Wie mappe ich Attributrouten für Controller in einer referenzierten Assembly?

EDIT:

Ich habe eine Haupt-MVC-Anwendung, die Baugruppen aus einer Datei lädt. Diese Baugruppen sind wie so strukturiert:

Add-On Assembly Structure

ich den Code erweitert für eine Steuerung zu schaffen und einen Blick zu finden, aber ich kann in der Außenmontage wie folgt keine Anleitung, wie zu handhaben (Karte) RouteAttribute s angegeben finden :

[RoutePrefix("test-addon")] 
public class MyTestController : Controller 
{ 
    [Route] 
    public ActionResult Page() 
    { 
     return View(new TestModel { Message = "This is a model test." }); 
    } 
} 
+1

Ist das benutzerdefinierte Framework oder ein CMS? Es wäre gut, einen Code zu zeigen, um ihn besser zu verstehen. –

+0

Bitte erzähle das Problem etwas detaillierter mit Code. – inthevortex

Antwort

0

Ich habe es geschafft, eine Lösung zu finden: manuell Route Attribute in das Route Dictionary zu parsen. Wahrscheinlich tut es nicht 100% richtig, aber dies scheint bisher zu funktionieren:

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

Die scheinbar übermäßigen Ordnungen sind eigentlich nur, um sicherzustellen, dass es unter keinen Umständen es ein zusätzliches ‚/‘ am Anfang, Mitte oder Ende .