引用/外部程序集中的MapMvcAttributeRoutes

我正在使用动态加载的程序集作为MVC控制器(插件/附加框架)的源代码。我无法找到在引用程序集中映射控制器的属性路由的方法。引用/外部程序集中的MapMvcAttributeRoutes

我试过从引用的程序集中调用MapMvcAttributeRoutes(就像文章中提到的那样可以在Web API中工作),但那没用。

如何映射引用程序集中控制器的属性路由?

编辑:

我有一个主要的MVC应用程序从文件加载程序集。这些组件的结构,像这样:

我扩展的代码创建一个控制器和寻找的看法,但我可以找到关于如何处理这样的外部组件规定(图)RouteAttribute没什么说明:

[RoutePrefix("test-addon")] 

public class MyTestController : Controller

{

[Route]

public ActionResult Page()

{

return View(new TestModel { Message = "This is a model test." });

}

}

回答:

我设法找到一个解决方案:手动解析路由属性到路由字典。也许没有这样做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));

}

}

}

}

看似过度修剪,实际上只是为了确保任何条件下都没有任何多余的“/”在开始,中间或结束。

以上是 引用/外部程序集中的MapMvcAttributeRoutes 的全部内容, 来源链接: utcz.com/qa/260701.html

回到顶部