Defaults:
Url包含的段的数量可以比于其匹配的模式中的url参数的数量少,如:
http://localhost:8001/blog/2011/11没有day参数的指定数值,在这种情况下,需要为缺少的参数指定默认值,可以通过Defaluts属性完成
Defaults是一个RouteValueDictionary对象,该对象为每个希望为其提供默认值的参数包含一个条目:RouteValueDictionary类是一个与常规字典类似的键/值对集合,但具有有一些特定的方法,这些方法使得路由引擎能够工作,并且是创建该类的实例更加容易。
示例:
匿名类型创建,每个属性作为健的名称:
blog.Defaults = new RouteValueDictionary(
new
{
year="2011",
month="11",
day="0"
}
);
集合初始化程序,需要想构造器传递一个键/值对的集合
blog.Defaults =new RouteValueDictionary {
{"year",2009},
{"month",11},
{"day",0}
};
Constraints:
Constraints包含针对url参数验证规则的字典,constraints属性也是RouteValueDictionary类型,在该属性中键是参数名称,值是验证规则
Constraints验证规则一:
正则表达式:
blog.Constraints = new RouteValueDictionary(
new {
year=@"\d{2}|\d{4}",
month = @"\d{1,2}",
day=@"\d{1,2}"}
);
IRouteConstraint:
如果不能满足你的需求,可以通过实现一个IRouteConstraint接口类编写自己的约束:
示例:
public class DataIsVaildConstraint : IRouteConstraint
{
#region IRouteConstraint 成员
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
try
{
DateTime date = new DateTime(
Convert .ToInt32(values["year"]),
Convert.ToInt32 (values ["month"]),
Convert.ToInt32 (values ["day"])
);
return true;
}
catch
{
return false;
}
}
#endregion
}
修改Constraints属性:
blog.Constraints = new RouteValueDictionary(
new {
year=@"\d{2}|\d{4}",
month = @"\d{1,2}",
day=@"\d{1,2}",
urldate = new DataIsVaildConstraint()
}
);
);
备注:自定义的约束被应用于虚拟的url参数(urldate)。这样做的原因有2:
1.必须是数字。这个三个参数,框架已经验证,验证函数就不需要在重复工作
2.约束不是限定一个参数而是全部参数,因此将约束仅限一个参数并不好