【问题标题】:ASP.NET MVC routing URLs starting with numbers以数字开头的 ASP.NET MVC 路由 URL
【发布时间】:2016-06-15 11:40:01
【问题描述】:

显然,在 C# 中,类不允许以数字开头,那么如何在 ASP.NET 4.6 中为以数字开头的 URL 创建控制器?

示例网址:

www.domain.com/40apples/

编辑:单独路由每个 URL 很快就会变得难以管理。理想情况下,我正在寻找一种可以处理所有数字 URL 的解决方案。这样上面的 URL 示例路由到 _40apples 控制器,300cherries 到 _300cherries 和 1orange 到 _1orange

【问题讨论】:

  • 你不能有public class 40ApplesController,但你可以有一个route,它会匹配/40apples

标签: c# asp.net .net asp.net-mvc asp.net-mvc-routing


【解决方案1】:

您必须使用自定义路由,在您的 RegisterRoutes 方法中,您可以添加另一个看起来像这样的路由:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "ApplesRoute",                                           // Route name
            "40apples/{action}",                            // URL with parameters
            new { controller = "Apples", action = "Index" }  // Parameter defaults
        );

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }

如果您希望您的路线捕获以数字+苹果开头的任何内容,您可以使用正则表达式约束。像这样的:

routes.MapRoute(
        "ApplesRoute",                                           // Route name
        "{number}apples/{action}",                            // URL with parameters
        new { controller = "Apples", action = "Index" }  // Parameter defaults
       ,new {number = @"\d+" } //constraint
    );

更通用的方法是捕获所有以数字 + 单词开头的路线。然后你可以像这样构建你的路线和约束:

routes.MapRoute(
        "NumbersRoute",                                           // Route name
        "{numberfruit}/{action}",                            // URL with parameters
        new { controller = "Numbers", action = "Index" }  // Parameter defaults
       ,new { numberfruit = @"\d+[A-Za-z]" } //constraint
    );

与 Organic 讨论后编辑:

在这种情况下解决问题的方法是使用属性路由。如果您使用的是 mvc 5 或更高版本,则效果很好。

然后你会添加一个类似的属性路由到你的控制器:

[RoutePrefix("40apples")]

然后是每个特定操作的另一条路线:

[Route("{Buy}")]

不要忘记将routes.MapMvcAttributeRoutes(); 添加到您的路由配置中。

【讨论】:

  • 啊!如果我有几十或几百页以数字开头怎么办?是否可以创建一个通用规则来处理所有以数字开头的 URL?
  • 是的,我相信你可以使用正则表达式路由来做到这一点,我会添加一个示例。
  • 用更通用的示例更新了我的答案。如果您需要扩展它以处理更多路线,您可能只是在该示例的基础上构建更多路线约束等。
  • 谢谢。看起来很有希望,但我认为正则表达式规则不会处理数字后带有任何文本的数字 URL。要考虑的网址:40 个苹果、1 个橙子、300 个樱桃
  • 更新了另一个可以处理您的案件的答案
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 2010-11-13
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多