我有个问题
我的路线在分层类别之后有一个额外的参数。
/2009/世界/亚洲/08/12/bla-bla-bla
asp.net mvc 不支持这个,因为我的路由应该是
{year}/{*category}/{month}/{day}/{name}
我尝试使用约束,例如
year = @"(\d{4})",category = @"((.+)/)+", month = @"(\d{2})", day = @"(\d{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})"
但我找不到任何解决方案。
有意见吗?
谢谢
我很确定路由处理程序在斜杠字符上进行标记,因此您将无法拥有包含斜杠的类别——尽管转义它可能有效,但不确定。您可能希望将 URL 格式化为:
/2009/World+Asia/08/12/bla-bla-bla
这应该将类别翻译为“亚洲世界”。
如果这不起作用,那么也许您还需要与子类别匹配的另一条路线。
{year}/{category}/{subcategory}/{month}/{day}/{name}
使用 name 参数向您的路由添加另一个规则。
如果我理解得很好,你想限制和对值施加一些约束可以作为路由部分传递,你可以使用 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 方法。
希望这有帮助。