为带有子文件夹的 ASP.NET MVC 区域路由生成 URL

Generating URLs for ASP.NET MVC Area routing with subfolder

我有一个 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/仪表板小部件/Home/Index

如何根据需要生成urls,到区域的根目录,或者到区域下的这个子文件夹?

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

切换呼叫
@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"} )