mvc路由5大属性

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.约束不是限定一个参数而是全部参数,因此将约束仅限一个参数并不好

posted @ 2012-03-23 13:35  sulin  阅读(325)  评论(0)    收藏  举报