Exemplo n.º 1
0
        /// <summary>
        /// Maps new route according to configuration
        /// </summary>
        public FluentRouter Map(string name, Action <IFluentRouteConfiguration> configuration)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            var config = new FluentRouteConfiguration();

            foreach (var template in m_scopes.Where(s => s != null))
            {
                template(config);
            }

            if (m_template != null)
            {
                m_template(config);
            }

            configuration(config);

            // create new route for each url; first url is considered to be default
            var urls = config.Urls.Reverse().ToArray();

            if (!string.IsNullOrEmpty(config.NamePrefix))
            {
                name = config.NamePrefix + "_" + name;
            }

            for (var i = 0; i < urls.Length; i++)
            {
                var pair = urls[i];

                var isDefault = i + 1 == urls.Length;
                var culture   = pair.Key;
                var routeName = isDefault ? name : name + ":" + culture;

                var route = Create(routeName, pair.Value, config);

                route.Defaults.Add("culture", culture);

                // default route doesn't take culture into consideration
                if (!isDefault)
                {
                    route.Constraints.Add("_culture", new CultureConstraint(culture));
                }

                m_routes.Add(routeName, route);
            }

            return(this);
        }
Exemplo n.º 2
0
        private Route Create(string name, string url, FluentRouteConfiguration config)
        {
            var route = default(Route);

            var handler     = config.Handler ?? new MvcRouteHandler();
            var defaults    = config.Defaults == null ? new RouteValueDictionary() : new RouteValueDictionary(config.Defaults);
            var constraints = config.Constraints == null ? new RouteValueDictionary() : new RouteValueDictionary(config.Constraints);
            var dataTokens  = config.DataTokens == null ? new RouteValueDictionary() : new RouteValueDictionary(config.DataTokens);

            // create complex route only when required
            if (config.Rules != null && config.Rules.Any())
            {
                // no need to clone rules, it's always cloned from within MvcComplexRoute
                route = new MvcComplexRoute(url, config.Rules, handler);
            }
            else
            {
                route = new Route(url, handler);
            }

            route.Defaults    = defaults;
            route.Constraints = constraints;
            route.DataTokens  = dataTokens;

            if ((config.Namespaces != null) && (config.Namespaces.Length > 0))
            {
                route.DataTokens["Namespaces"] = config.Namespaces;
            }

            if (m_areaName != null && m_areaName.Length > 0)
            {
                route.DataTokens["area"] = m_areaName;
                route.DataTokens["UseNamespaceFallback"] = config.Namespaces == null || config.Namespaces.Length == 0;
            }

            return(route);
        }
Exemplo n.º 3
0
        private Route Create(string name, string url, FluentRouteConfiguration config)
        {
            var route = default(Route);

            var handler = config.Handler ?? new MvcRouteHandler();
            var defaults = config.Defaults == null ? new RouteValueDictionary() : new RouteValueDictionary(config.Defaults);
            var constraints = config.Constraints == null ? new RouteValueDictionary() : new RouteValueDictionary(config.Constraints);
            var dataTokens = config.DataTokens == null ? new RouteValueDictionary() : new RouteValueDictionary(config.DataTokens);

            // create complex route only when required
            if (config.Rules != null && config.Rules.Any())
                // no need to clone rules, it's always cloned from within MvcComplexRoute
                route = new MvcComplexRoute(url, config.Rules, handler);
            else
                route = new Route(url, handler);

            route.Defaults = defaults;
            route.Constraints = constraints;
            route.DataTokens = dataTokens;

            if ((config.Namespaces != null) && (config.Namespaces.Length > 0))
            {
                route.DataTokens["Namespaces"] = config.Namespaces;
            }

            if (m_areaName != null && m_areaName.Length > 0)
            {
                route.DataTokens["area"] = m_areaName;
                route.DataTokens["UseNamespaceFallback"] = config.Namespaces == null || config.Namespaces.Length == 0;
            }

            return route;
        }
Exemplo n.º 4
0
        /// <summary>
        /// Maps new route according to configuration
        /// </summary>
        public FluentRouter Map(string name, Action<IFluentRouteConfiguration> configuration)
        {
            if (name == null)
                throw new ArgumentNullException("name");
            if (configuration == null)
                throw new ArgumentNullException("configuration");

            var config = new FluentRouteConfiguration();

            foreach (var template in m_scopes.Where(s => s != null))
                template(config);

            if (m_template != null)
                m_template(config);

            configuration(config);

            // create new route for each url; first url is considered to be default
            var urls = config.Urls.Reverse().ToArray();

            if (!string.IsNullOrEmpty(config.NamePrefix))
                name = config.NamePrefix + "_" + name;

            for (var i = 0; i < urls.Length; i++)
            {
                var pair = urls[i];

                var isDefault = i + 1 == urls.Length;
                var culture = pair.Key;
                var routeName = isDefault ? name : name + ":" + culture;

                var route = Create(routeName, pair.Value, config);

                route.Defaults.Add("culture", culture);

                // default route doesn't take culture into consideration
                if (!isDefault)
                    route.Constraints.Add("_culture", new CultureConstraint(culture));

                m_routes.Add(routeName, route);
            }

            return this;
        }