ASP.NET MVC 将单个控制器映射到网站的根目录

ASP.NET MVC map single controller to root of website

我正在开发一个 ASP.NET MVC 5 网站,该网站有一个 public "marketing" 网站,其中包含一些静态页面,其中包含有关公司、法律、社会、联系我们的信息,等等,一个未登录的用户可以访问。然后,一旦登录,网站后端就会有注册用户可以访问的功能。

最初我将所有 public "marketing" 个页面转到 http://www.mywebsite.com/Marketing/About, http://www.mywebsite.com/Marketing/Social,等等

但是,企业希望所有 "marketing" 页面都可以从根网站向下访问一个目录,因此上面的 links 可以通过以下方式访问: http://www.mywebsite.com/About, http://www.mywebsite.com/Social,等等

我知道我可以使用以下方法通过为每个 "marketing" 页面注册单独的路由来使其工作,如下所示:

        routes.MapRoute(
            "ShortAbout",
            "About",
            new { controller = "Marketing", action = "About" }
        );

        routes.MapRoute(
            "ShortSocial",
            "Social",
            new { controller = "Marketing", action = "Social" }
        );

但是,由于大约有 15 "marketing" 页,这似乎效率低下,似乎必须有更好的方法来做到这一点。

我还尝试了此处概述的通用路由方法:http://www.wduffy.co.uk/blog/aspnet-mvc-root-urls-with-generic-routing/

但这种方法的问题是我有一个 "marketing" 页面,与控制器同名,它最终将用户转发到营销子目录。例如,我有一个名为 "MachineController" 的控制器,在 "MarketingController" 中我有一个名为 "Machine" 的 action/page,因此它将用户转发到 /Marketing/Machine 使用上面的方法 link.

还有其他想法吗?提前致谢。

我正好遇到了这个问题。一个更简单但更硬编码的解决方案是

routes.MapRoute("MarketingPages", "{action}",
  new { controller = "Marketing" },
  new { action = @"About|Social" });

最后一个匿名对象将路由限制为匹配路由,其中​​操作与提供的正则表达式匹配,这只是您想要营销页面的 urls 的列表。任何其他 url 像 '/something' 落入下面的路线。