ASP.NET MVC层次结构URL路由

时间:2009-12-09 15:11:42

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

我遇到了问题

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

  

/ 2009 /世界/亚/ 08/12 / BLA-BLA-BLA

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

  

{一年} / {*类别} / {月} / {天} / {名}

我尝试使用像

这样的约束
year = @"(\d{4})",category = @"((.+)/)+", month = @"(\d{2})", day = @"(\d{2})"

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

有评论吗?

谢谢

3 个答案:

答案 0 :(得分:1)

我很确定路由处理程序会对斜杠字符进行标记,因此您将无法使用包含斜杠的类别 - 尽管可以使用它,但不确定。您可能希望将您的网址格式设置为:

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

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

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

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

答案 1 :(得分:0)

使用name参数为路由添加另一条规则。

答案 2 :(得分:0)

如果我理解得很好,你想限制并对值进行一些约束可以作为路由部分传递,你可以使用Route Constraint来实现。 Plaese读了Creating a Route Constraint (C#),你会发现这是可能的。你可以这样做:

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

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

  

/产品/ 3

     

/产品/ 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方法。

希望得到这个帮助。