我有一个ASP.NET MVC应用程序,该应用程序的区域具有如下特殊路径:
区域注册文件:
context.Routes.MapHttpRoute(
"AccessControlApi_default",
"accesscontrol/api/{controller}/{id}",
new { id = RouteParameter.Optional }
);
context.MapRoute(
"AccessControl_dashboardwidgets",
"accesscontrol/dashboardwidgets/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new[] { "AccessControl.Controllers.DashboardWidgets" }
);
context.MapRoute(
"AccessControl_default",
"accesscontrol/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new[] { "AccessControl.Controllers" }
);
第一个路由用于api,第二个路由用于该区域下子文件夹中的控制器和视图,第三个路由用于该区域下的默认控制器。
一切都可以很好地与路由配合使用,但是问题在于使用像这样的Url.Action
:
<a href='@Url.Action("Index","Home",new{area="AccessControl"})'>Go to home</a>
它总是在区域和控制器之间的URL中注入dashboardwidgets关键字,如下所示:{host} / accesscontrol / dashboardwidgets / Home / Index
如何根据我的需要生成URL,或者到区域的根目录,还是到该区域下的这个子文件夹?
我认为解决方案是在构建链接时使用命名路由。您需要从
切换呼叫@Url.Action("Index","Home",new{area="AccessControl"})
到
@Url.RouteUrl("AccessControl_dashboardwidgets", new {area = "AccessControl", controller="Home", action="Index"})
或
@Url.RouteUrl("AccessControl_default", new {area = "AccessControl", controller="Home", action="Index"})
取决于您要瞄准的路线。
对参数的混淆,很抱歉,正在做其他事情时正在编辑……显然应该避免在星期一早上执行多任务:)
为了使用@ Url.Action扩展方法,您需要像这样为routeValues参数指定httproute名称:
@Url.Action("Index","Home", new { httproute ="AccessControlApi_default"} )