2

我有个问题

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

/2009/世界/亚洲/08/12/bla-bla-bla

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

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

我尝试使用约束,例如

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

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

有意见吗?

谢谢

4

3 回答 3

1

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

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

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

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

{year}/{category}/{subcategory}/{month}/{day}/{name}
于 2009-12-09T15:22:05.460 回答
0

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

于 2009-12-09T15:21:38.643 回答
0

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

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

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

/产品/3

/产品/8999

但不是以下 URL:

/产品/苹果

/产品

此外,您可以编写自定义路由约束,请阅读创建自定义路由约束 (C#)并查看我刚刚从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 方法。

希望这有帮助。

于 2018-05-01T15:13:51.417 回答