我的项目中,使用Route特性进行路由组织。
其中父控制器CatalogControllerBase<TEntity>有Index/List/Add/Update/Delete/Exists/Upload/Download八个方法。
子控制器如下:
[RouteArea("master")]
[RoutePrefix("item")]
ItemController:CatalogControllerBase<ItemEntity>
[RouteArea("master")]
[RoutePrefix("category")]
CategoryController:CatalogControllerBase<CategoryEntity>
[RouteArea("master")]
[RoutePrefix("print")]
PrintController:CatalogControllerBase<PrintEntity>
我子控制器的视图中,使用@Url.Action方法,返回了空URL。
比如在Item控制器的List视图中,我尝试如下三种写法@Url.Action("Add"),@Url.Action("Add", "Item"),@Url.Action("Add", "Item", new { Area = "master" })均是返回空"".
直接硬编码"/master/item/add"是没有问题的,访问该URL正常显示。
请教大家,这是什么原因,应该如何解决才能正确获得URL?
PS:硬编写URL除外。
我在这里找到了解决方案:
https://stackoverflow.com/questions/23431043/mvc-attribute-routes-route-inheritance
https://stackoverflow.com/questions/19989023/net-webapi-attribute-routing-and-inheritance
该帖子里说继承IDirectRouteProvider接口,自己写实现。
我的做法是继承DefaultDirectRouteProvider类,重写GetActionRouteFactories方法。
实现代码如下:
public class CustomDirectRouteProvider : DefaultDirectRouteProvider { protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(ActionDescriptor actionDescriptor) { // inherit route attributes decorated on base class controller's actions var data= actionDescriptor.GetCustomAttributes(typeof(IDirectRouteFactory), true) .Cast<IDirectRouteFactory>() .ToList(); var list = new ReadOnlyCollection<IDirectRouteFactory>(data); return list; } }
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { ... routes.MapMvcAttributeRoutes(constraintsResolver, new CustomDirectRouteProvider()); ... } }
谢谢大家。
你的项目目录贴出来看看
我的问题类似于这个https://stackoverflow.com/questions/23431043/mvc-attribute-routes-route-inheritance.
已经采用这个帖子的方案解决了,谢谢。