在向我的路由参数添加自定义路由约束时,我发现它破坏了我用来构建链接的 Url.Action 方法。如果路由约束只是一个正则表达式,那么 Url.Action 方法将继续识别参数,但是如果它是我定义的自定义约束,则 Url.Action 方法将我的参数作为请求参数。
这是我的路线定义:
routes.MapRoute(
"Event",
"Events/{strDate}",
new { controller = "Events", action = "Index", strDate = DateTime.Today.ToString("yyyy-MM-dd") },
new { strDate = new IsValidDateConstraint() },
new[] { "MyProject.Controllers" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] { "MyProject.Controllers" }
);
IsValidDateConstraint 类继承自 IRouteConstraint,如果 strDate 参数正确解析为 DateTime 对象,则返回 true 或 false:
public class IsValidDateConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.IncomingRequest)
{
DateTime dt = new DateTime();
if (DateTime.TryParse(values["strDate"].ToString(), out dt))
return true;
}
return false;
}
}
使用 Url.Action 方法构建 URL:
@Url.Action("Index", "Events", new { strDate = ViewBag.CurrentDate.AddDays(1).ToString("yyyy-MM-dd") })
结果链接是:/Events?strDate=2012-08-15
如果我输入 /Events/2012-08-15,一切都会正确路由,只是 Url.Action 方法没有识别 strDate 是我的路由中定义的参数,只有当我应用我的自定义路由约束时。如果我注释掉自定义路由约束,那么 Url.Action 方法会正确映射 URL。
当我定义了自定义路由约束时,关于为什么 Url.Action 无法识别我的路由参数的任何想法?