混合 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 和 MVC 路由

混合 SPA 和 ASP.NET MVC 路由

ASP.NET Core MVC 混合路由/FromBody 模型绑定和验证

表单身份验证、ASP.NET MVC 和 WCF RESTful 服务

MVC Contrib 是不是兑现了提高 ASP.NET MVC 生产力的承诺

在 ASP.NET Core 2 中处理异常的推荐方法? [关闭]