导航

09-002 Routing 之 RouteTemplate

Posted on 2015-04-07 15:36  DotNet1010  阅读(847)  评论(0)    收藏  举报

关于RouteTemplate 举几个例子:

                 var template = "{p1}/{p2}/{*p3}";
                 var template = "{controller}/{action}/{id:int=5}“
                 var template = "cool-{p1}";
                 var template = "{p1}.{p2}.{p3?}";

 上面的引号中的部分称为:RouteTemplate 路由模板。

每一个路由模板包含一个 模板片段的集合:

   public List<TemplateSegment> Segments { get; private set; }

 反斜杠 ”/" 用来分隔 TemplateSegment 如 {controller}/{action}/{id:int=5} 便是有三个TemplateSegment;

 TemplateSegment 中包含一个TemplatePart的集合:

      public List<TemplatePart> Parts
        {
            get { return _parts; }
        }

 Templatepart 要么是文本 要么是参数 参数举例如:{controller} {id:int=5}

123{a}456{b} 这是一个 TemplateSegment 包含了四个TemplatePart 分别为:123;{a} ;456;{b}. 其中 {a} 和 {b} 为参数。

看一下 TemplatePart 的代码:

  [DebuggerDisplay("{DebuggerToString()}")]
    public class TemplatePart
    {
        public static TemplatePart CreateLiteral(string text)
        {
            return new TemplatePart()
            {
                IsLiteral = true,
                Text = text,
            };
        }

        public static TemplatePart CreateParameter([NotNull] string name,
                                                   bool isCatchAll,
                                                   bool isOptional,
                                                   object defaultValue,
                                                   IEnumerable<InlineConstraint> inlineConstraints)
        {
            return new TemplatePart()
            {
                IsParameter = true,
                Name = name,                  //参数名称
                IsCatchAll = isCatchAll,      //剩余部分
                IsOptional = isOptional,      //可选参数
                DefaultValue = defaultValue,  // 默认值
                InlineConstraints = inlineConstraints ?? Enumerable.Empty<InlineConstraint>(),
            };
        }

        public bool IsCatchAll { get; private set; }
        public bool IsLiteral { get; private set; }
        public bool IsParameter { get; private set; }
        public bool IsOptional { get; private set; }
        public bool IsOptionalSeperator { get; set; }
        public string Name { get; private set; }
        public string Text { get; private set; }
        public object DefaultValue { get; private set; }
        public IEnumerable<InlineConstraint> InlineConstraints { get; private set; }

        internal string DebuggerToString()
        {
            if (IsParameter)
            {
                return "{" + (IsCatchAll ? "*" : string.Empty) + Name + (IsOptional ? "?" : string.Empty) + "}";
            }
            else
            {
                return Text;
            }
        }
    }