【问题标题】:ASP.NET MVC Hierarchy Url RoutingASP.NET MVC 层次结构 URL 路由
【发布时间】:2010-12-24 21:01:00
【问题描述】:

我有问题

我的路线在分层类别之后有一个额外的参数。

/2009/World/Asia/08/12/bla-bla-bla

asp.net mvc 不支持这个因为我的路由应该是

{year}/{*category}/{month}/{day}/{name}

我尝试使用类似的约束

year = @"(\d{4})",category = @"((.+)/)+", month = @"(\d{2})", day = @"(\d{2})"

但我找不到任何解决方案。

有什么意见吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

    使用 name 参数向您的路由添加另一条规则。

    【讨论】:

      【解决方案2】:

      我很确定路由处理程序会在斜杠字符上进行标记,因此您将无法拥有包含斜杠的类别——尽管转义它可能有效,但对此不确定。您可能希望将 URL 格式化为:

      /2009/World+Asia/08/12/bla-bla-bla
      

      这应该将类别翻译为“亚洲世界”。

      如果这不起作用,那么您可能还需要另一条与子类别匹配的路线。

      {year}/{category}/{subcategory}/{month}/{day}/{name}
      

      【讨论】:

        【解决方案3】:

        如果我理解得很好,你想限制和对值施加一些约束可以作为路由部分传递,你可以使用 Route Constraint 来做到这一点。请阅读Creating a Route Constraint (C#),您会发现这是怎么可能的。你可以这样做:

        routes.MapRoute(
            "Product",
            "Product/{productId}",
            new {controller="Product", action="Details"},
            new {productId = @"\d+" }
         );
        

        正则表达式 \d+ 匹配一个或多个整数。此约束导致 Product 路由匹配以下 URL:

        /产品/3

        /Product/8999

        但不包括以下网址:

        /产品/苹果

        /产品

        另外您可以编写自定义路由约束,请阅读Creating a Custom Route Constraint (C#) 并查看我刚刚从This post by Guy Burstein 复制的以下示例,我认为您觉得它很有用:

        public class FromValuesListConstraint : IRouteConstraint
            {
              public FromValuesListConstraint(params string[] values)
              {
                this._values = values;
              }
        
              private string[] _values;
        
              public bool Match(HttpContextBase httpContext, 
                Route route, 
                string parameterName, 
                RouteValueDictionary values, 
                RouteDirection routeDirection)
              {
                // Get the value called "parameterName" from the 
                // RouteValueDictionary called "value"
                string value = values[parameterName].ToString();
        
                // Return true is the list of allowed values contains 
                // this value.
                return _values.Contains(value);
              }
            }
        

        正如 Guy 所说:为了实现自定义路由约束,你应该创建一个继承自 IRouteConstraint 的类,并实现 Match 方法。

        希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 2010-12-07
          • 2017-03-12
          • 1970-01-01
          • 2013-04-12
          • 2013-09-26
          • 1970-01-01
          • 2010-11-22
          • 2010-11-13
          相关资源
          最近更新 更多