混合 ASP.NET 和 MVC 路由
Posted
技术标签:
【中文标题】混合 ASP.NET 和 MVC 路由【英文标题】:Mixing ASP.NET and MVC routing 【发布时间】:2016-04-26 22:08:29 【问题描述】:我以为我可以为我的混合 ASP.NET + MVC 应用程序中的所有路由提供友好的 URL,但它没有按我预期的那样工作。这是我的路由定义设置:
public static void RegisterRoutes(RouteCollection routes)
routes.IgnoreRoute("resource.axd/*pathInfo");
routes.MapPageRoute("Design-Fancy", "Design/Fancy/*queryvalues", "~/Design/example10.aspx", true);
routes.MapPageRoute("Design-Simple", "Design/Simple/*queryvalues", "~/Design/example5.aspx", true);
routes.MapRoute(
name: "Default",
url: "controller/action/id",
defaults: new controller = "Home", action = "Index", id = UrlParameter.Optional
);
虽然这适用于路由到 *.aspx 页面,但同一页面上的任何 Razor 操作标记(例如定义为控制器的“主页”和操作的“关于”)实际上在页面源中呈现为'http://..../Design/Fancy?action=About&controller=Home'。所以,这会破坏所有导航菜单 URL 等。我一定是做错了!
【问题讨论】:
你的剃须刀动作是什么样的? 您可以尝试通过将“默认”路由放在“设计-花式”和“设计-简单”路由之前来更改映射路由的顺序,因为首先映射的路由具有更高的优先级。但是,这可能会破坏 Fancy 和 Simple 路由的正常行为。 packtpub.com/books/content/… 更改路由注册的顺序确实修复了 Razor 操作链接。 .aspx 页面的链接至少仍然可以正常工作。但是,在这种情况下,它们最终不会成为友好的 URL(如浏览器地址栏中显示的那样)。我得到:domain.tld/Design/example10.aspx 用于 .aspx 页面。我试图弄清楚如何为所有人保留友好的 URL。所以,谢谢 RoteS……这是部分答案。 【参考方案1】:这是我确定的解决方案。我安装了 NuGet Microsoft.AspNet.FriendlyUrls 包。然后我用一个没有扩展名的页面名称来命名 .aspx 页面。然后我设置路由如下:
public static void RegisterRoutes(RouteCollection routes)
FriendlyUrlSettings aspxSettings = new FriendlyUrlSettings();
aspxSettings.AutoRedirectMode = RedirectMode.Off; // default=Off
routes.EnableFriendlyUrls(aspxSettings);
routes.IgnoreRoute("resource.axd/*pathInfo");
routes.MapRoute(
name: "Default",
url: "controller/action/id",
defaults: new controller = "Home", action = "Index", id = UrlParameter.Optional
);
routes.MapPageRoute("Design-Fancy", "Design/Fancy/*queryvalues", "~/Design/Fancy.aspx", true);
routes.MapPageRoute("Design-Simple", "Design/Simple/*queryvalues", "~/Design/Simple.aspx", true);
这提供了我想要的效果,并与我的 MVC 路由一起使用,并导致路由到 .aspx 页面,同时删除 .aspx 扩展名。
【讨论】:
以上是关于混合 ASP.NET 和 MVC 路由的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core MVC 混合路由/FromBody 模型绑定和验证
表单身份验证、ASP.NET MVC 和 WCF RESTful 服务