对于 MVC 5,也可能是 4,RouteConfig 现在是定义默认路由的地方。在默认路由映射之前,我有很多“routes.IgnoreRoute”调用,这里有一个例子:
routes.IgnoreRoute("{*changeaccount}", new { changeaccount = @"(.*/)?change.account(/.*)?" });
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
现在,当我向站点添加设置区域时,导航到会在该区域中执行操作的 URL,然后尝试导航到 change.account,RouteConfig 中的忽略路由调用不再阻止该调用从被馈送到路由引擎。
在阅读了这篇文章并浏览了其他地方之后,我意识到我基本上可以在我的 SettingsAreaConfiguration.cs 文件中进行相同的忽略路由调用,只是 Routes 作为 AreaRegistrationContext 的属性存在的细微差别。
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.IgnoreRoute("{*changeaccount}", new { changeaccount = @"(.*/)?change.account(/.*)?" });
context.MapRoute(
"Settings_default",
"Settings/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
还有哇!问题解决了!!
现在我有很多对 IgnoreRoute 的调用,因此我将所有这些在我的站点中的标准调用复制到了一个扩展 RouteCollection 的新扩展方法。
public static class RouteCollectionExtensions
{
public static void IgnoreRoutesCommon(this RouteCollection routes)
{
routes.IgnoreRoute("{*changeaccount}", new { changeaccount = @"(.*/)?change.account(/.*)?" });
}
}
我可以在此方法中添加更多 IgnoreRoute 调用,因为我有一个中心位置来存储所有这些调用。
现在,我可以将“change.account”的特定 IgnoreRoute 调用替换为对我的扩展方法的调用。
所以 RouteConfig.cs 文件中的调用如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoutesForCommon();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
SettingsAreaConfiguration.cs 文件中的调用如下所示:
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.IgnoreRoutesForCommon();
context.MapRoute(
"Settings_default",
"Settings/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
呸呸呸! :O)