导航

09-004 Routing 之 TemplateParser

Posted on 2015-04-07 17:40  DotNet1010  阅读(184)  评论(0)    收藏  举报

这个类主要是分析 routeTemplate(字符串)  返回: RouteTemplate(对象)

        private const char Separator = '/';  //Segment 分隔符号
        private const char OpenBrace = '{';   //参数开始符号
        private const char CloseBrace = '}';  //参数结束符号
        private const char EqualsSign = '=';   //默认值
        private const char QuestionMark = '?';   //可选
        private const char Asterisk = '*';        //CatchAll 
        private const string PeriodString = ".";   //可选参数前面的.符号是 可选的

 Parser 方法代码为:

        public static RouteTemplate Parse(string routeTemplate)
        {
            if (routeTemplate == null)
            {
                routeTemplate = String.Empty;
            }

			// 不能以 ~  或者 / 开始
            if (IsInvalidRouteTemplate(routeTemplate))
            {
                throw new ArgumentException(Resources.TemplateRoute_InvalidRouteTemplate, "routeTemplate");
            }

            var context = new TemplateParserContext(routeTemplate);
            var segments = new List<TemplateSegment>();

            while (context.Next())
            {
                if (context.Current == Separator)
                {
                    // If we get here is means that there's a consecutive '/' character.
                    // Templates don't start with a '/' and parsing a segment consumes the separator.
                    throw new ArgumentException(Resources.TemplateRoute_CannotHaveConsecutiveSeparators,
                                                "routeTemplate");
                }
                else
                {
                    if (!ParseSegment(context, segments))
                    {
                        throw new ArgumentException(context.Error, "routeTemplate");
                    }
                }
            }

	    //catchAll 如果有必须是最后一个参数
            if (IsAllValid(context, segments))
            {
                return new RouteTemplate(segments);
            }
            else
            {
                throw new ArgumentException(context.Error, "routeTemplate");
            }
        }