/// <summary>
        /// Adds a folder route for all pages in the specified area and under the specified area folder.
        /// These pages can be routed via their names prefixed by folder route in addition to the default
        /// set of path based routes. Links generated for these pages will use the specified folder route.
        /// </summary>
        public static PageConventionCollection AddAreaFolderRoute(this PageConventionCollection conventions,
                                                                  string areaName, string folderPath, string folderRoute)
        {
            conventions.AddAreaFolderRouteModelConvention(areaName, folderPath, model =>
            {
                foreach (var selector in model.Selectors.ToArray())
                {
                    if (selector.AttributeRouteModel.Template.StartsWith(areaName))
                    {
                        selector.AttributeRouteModel.SuppressLinkGeneration = true;

                        var template = (folderRoute.Trim('/') + '/' + selector.AttributeRouteModel
                                        .Template.Substring(areaName.Length).TrimStart('/')).TrimEnd('/');

                        model.Selectors.Add(new SelectorModel
                        {
                            AttributeRouteModel = new AttributeRouteModel
                            {
                                Template = template
                            }
                        });
                    }
                }
            });

            return(conventions);
        }
コード例 #2
0
        internal static PageConventionCollection AddAreaFolderRouteInternal(this PageConventionCollection conventions,
                                                                            string areaName, string folderPath, string folderRoute, bool isAdmin)
        {
            conventions.AddAreaFolderRouteModelConvention(areaName, folderPath, model =>
            {
                if (isAdmin != (model.ViewEnginePath.Contains("/Admin/") || model.Properties.ContainsKey("Admin")))
                {
                    return;
                }

                var areaFolder = areaName + folderPath;

                foreach (var selector in model.Selectors.ToArray())
                {
                    var route = selector.AttributeRouteModel;

                    if (route.Template.StartsWith(areaFolder, StringComparison.Ordinal) || (route.Template == areaName && folderPath == "/"))
                    {
                        route.SuppressLinkGeneration = true;

                        string template;

                        if (route.Template == areaName && folderPath == "/")
                        {
                            template = folderRoute;
                        }
                        else
                        {
                            var cleanSubTemplate = route.Template.Substring(areaFolder.Length).TrimStart('/');
                            template             = AttributeRouteModel.CombineTemplates(folderRoute, cleanSubTemplate);
                        }

                        model.Selectors.Add(new SelectorModel
                        {
                            AttributeRouteModel = new AttributeRouteModel
                            {
                                Template = template
                            }
                        });
                    }
                }
            });

            return(conventions);
        }