使用子文件夹生成ASP.NET MVC区域路由的URL

时间:2015-05-04 07:32:08

标签: c# asp.net asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas

我有一个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>

始终在区域和控制器之间的网址中注入 dashboardwidgets 关键字,如下所示: {host} / accesscontrol / dashboardwidgets / Home / Index

如何根据我的需要生成网址,可以是区域的根,还是区域下的子文件夹?

2 个答案:

答案 0 :(得分:3)

我认为解决方案是在构建链接时使用命名路由。您需要从

切换呼叫
@Url.RouteUrl("AccessControl_dashboardwidgets", new {area = "AccessControl", controller="Home", action="Index"})

@Url.RouteUrl("AccessControl_default", new {area = "AccessControl", controller="Home", action="Index"})

{{1}}

取决于您的目标路线。

对于参数的混淆感到抱歉,在做其他事情时进行了编辑......周一早上的多任务显然是要避免的:)

答案 1 :(得分:0)

要使用@ Url.Action扩展方法,您需要像这样为routeValues参数指定httproute名称:

@Url.Action("Index","Home", new { httproute ="AccessControlApi_default"} )