示例#1
0
        public void OnProvidersExecuting_AllowsRouteTemplatesWithOverridePattern()
        {
            // Arrange
            var items = new[]
            {
                TestRazorCompiledItem.CreateForPage("/Pages/Index.cshtml", metadata: new object[]
                {
                    new RazorCompiledItemMetadataAttribute("RouteTemplate", "~/some-other-prefix"),
                }),
                TestRazorCompiledItem.CreateForPage("/Pages/Home.cshtml", metadata: new object[]
                {
                    new RazorCompiledItemMetadataAttribute("RouteTemplate", "/some-prefix"),
                }),
            };

            var provider = CreateProvider(items);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                context.RouteModels,
                result =>
            {
                Assert.Equal("/Pages/Index.cshtml", result.RelativePath);
                Assert.Equal("/Index", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("some-other-prefix", selector.AttributeRouteModel.Template));
            },
                result =>
            {
                Assert.Equal("/Pages/Home.cshtml", result.RelativePath);
                Assert.Equal("/Home", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("some-prefix", selector.AttributeRouteModel.Template));
            });
        }
        public void OnProvidersExecuting_AddsMultipleSelectorsForIndexPage_WithIndexAtRoot()
        {
            // Arrange
            var descriptors = new[]
            {
                CreateVersion_2_0_Descriptor("/Pages/Index.cshtml"),
                CreateVersion_2_0_Descriptor("/Pages/Admin/Index.cshtml", "some-template"),
            };
            var options = new RazorPagesOptions {
                RootDirectory = "/"
            };

            var provider = CreateProvider(options: options, descriptors: descriptors);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                context.RouteModels,
                result =>
            {
                Assert.Equal("/Pages/Index.cshtml", result.RelativePath);
                Assert.Equal("/Pages/Index", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Pages/Index", selector.AttributeRouteModel.Template),
                    selector => Assert.Equal("Pages", selector.AttributeRouteModel.Template));
            },
                result =>
            {
                Assert.Equal("/Pages/Admin/Index.cshtml", result.RelativePath);
                Assert.Equal("/Pages/Admin/Index", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Pages/Admin/Index/some-template", selector.AttributeRouteModel.Template),
                    selector => Assert.Equal("Pages/Admin/some-template", selector.AttributeRouteModel.Template));
            });
        }
示例#3
0
        private void CreateModels(PageRouteModelProviderContext context)
        {
            var rootDirectory = _pagesOptions.RootDirectory;

            if (!rootDirectory.EndsWith("/", StringComparison.Ordinal))
            {
                rootDirectory = rootDirectory + "/";
            }

            var areaRootDirectory = "/Areas/";

            foreach (var viewDescriptor in GetViewDescriptors(_applicationManager))
            {
                if (viewDescriptor.Item != null && !ChecksumValidator.IsItemValid(_razorProjectEngine.FileSystem, viewDescriptor.Item))
                {
                    // If we get here, this compiled Page has different local content, so ignore it.
                    continue;
                }

                var            relativePath  = viewDescriptor.RelativePath;
                var            routeTemplate = GetRouteTemplate(viewDescriptor);
                PageRouteModel routeModel    = null;

                // When RootDirectory and AreaRootDirectory overlap (e.g. RootDirectory = '/', AreaRootDirectory = '/Areas'), we
                // only want to allow a page to be associated with the area route.
                if (_pagesOptions.AllowAreas && relativePath.StartsWith(areaRootDirectory, StringComparison.OrdinalIgnoreCase))
                {
                    routeModel = _routeModelFactory.CreateAreaRouteModel(relativePath, routeTemplate);
                }
                else if (relativePath.StartsWith(rootDirectory, StringComparison.OrdinalIgnoreCase))
                {
                    routeModel = _routeModelFactory.CreateRouteModel(relativePath, routeTemplate);
                }

                if (routeModel != null)
                {
                    context.RouteModels.Add(routeModel);
                }
            }
        }
        public void OnProvidersExecuting_AddsMultipleSelectorsForIndexPage()
        {
            // Arrange
            var items = new[]
            {
                TestRazorCompiledItem.CreateForPage("/Pages/Index.cshtml"),
                TestRazorCompiledItem.CreateForPage("/Pages/Admin/Index.cshtml", metadata: new object[]
                {
                    new RazorCompiledItemMetadataAttribute("RouteTemplate", "some-template"),
                }),
            };

            var provider = CreateProvider(items);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                context.RouteModels,
                result =>
            {
                Assert.Equal("/Pages/Index.cshtml", result.RelativePath);
                Assert.Equal("/Index", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Index", selector.AttributeRouteModel.Template),
                    selector => Assert.Equal("", selector.AttributeRouteModel.Template));
            },
                result =>
            {
                Assert.Equal("/Pages/Admin/Index.cshtml", result.RelativePath);
                Assert.Equal("/Admin/Index", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Admin/Index/some-template", selector.AttributeRouteModel.Template),
                    selector => Assert.Equal("Admin/some-template", selector.AttributeRouteModel.Template));
            });
        }
        public void OnProvidersExecuting_DoesNotAddsModelsForAreaPages_IfFeatureIsDisabled()
        {
            // Arrange
            var descriptors = new[]
            {
                CreateVersion_2_0_Descriptor("/Pages/About.cshtml"),
                CreateVersion_2_0_Descriptor("/Areas/Accounts/Pages/Home.cshtml"),
            };

            var options = new RazorPagesOptions {
                AllowAreas = false
            };

            var provider = CreateProvider(options: options, descriptors: descriptors);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                context.RouteModels,
                result =>
            {
                Assert.Equal("/Pages/About.cshtml", result.RelativePath);
                Assert.Equal("/About", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("About", selector.AttributeRouteModel.Template));
                Assert.Collection(
                    result.RouteValues.OrderBy(k => k.Key),
                    kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/About", kvp.Value);
                });
            });
        }
        public void OnProvidersExecuting_AddsMultipleSelectorsForIndexPages()
        {
            // Arrange
            var fileSystem = new VirtualRazorProjectFileSystem();

            fileSystem.Add(new TestRazorProjectItem("/Pages/Index.cshtml", "@page"));
            fileSystem.Add(new TestRazorProjectItem("/Pages/Test.cshtml", "Hello world"));
            fileSystem.Add(new TestRazorProjectItem("/Pages/Admin/Index.cshtml", "@page \"test\""));

            var optionsManager = Options.Create(new RazorPagesOptions());

            optionsManager.Value.RootDirectory = "/";
            var provider = new RazorProjectPageRouteModelProvider(fileSystem, optionsManager, NullLoggerFactory.Instance);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(context.RouteModels,
                              model =>
            {
                Assert.Equal("/Pages/Index.cshtml", model.RelativePath);
                Assert.Equal("/Pages/Index", model.ViewEnginePath);
                Assert.Collection(model.Selectors,
                                  selector => Assert.Equal("Pages/Index", selector.AttributeRouteModel.Template),
                                  selector => Assert.Equal("Pages", selector.AttributeRouteModel.Template));
            },
                              model =>
            {
                Assert.Equal("/Pages/Admin/Index.cshtml", model.RelativePath);
                Assert.Equal("/Pages/Admin/Index", model.ViewEnginePath);
                Assert.Collection(model.Selectors,
                                  selector => Assert.Equal("Pages/Admin/Index/test", selector.AttributeRouteModel.Template),
                                  selector => Assert.Equal("Pages/Admin/test", selector.AttributeRouteModel.Template));
            });
        }
        public void OnProvidersExecuting_ValidatesChecksum_RejectsPageWhenContentDoesntMatch()
        {
            // Arrange
            var descriptors = new[]
            {
                CreateVersion_2_1_Descriptor("/Pages/About.cshtml", metadata: new object[]
                {
                    new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Pages/About.cshtml"),
                }),
            };

            var fileSystem = new VirtualRazorProjectFileSystem();

            fileSystem.Add(new TestRazorProjectItem("/Pages/About.cshtml", "some other content"));

            var provider = CreateProvider(descriptors: descriptors, fileSystem: fileSystem);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Empty(context.RouteModels);
        }
        public void OnProvidersExecuting_UsesTheFirstDescriptorForEachPath()
        {
            // ViewsFeature may contain duplicate entries for the same Page - for instance when an app overloads a library's views.
            // It picks the first entry for each path. In the ordinary case, this should ensure that the app's Razor Pages are preferred
            // to a Razor Page added by a library.

            // Arrange
            var items = new[]
            {
                // Page coming from the app
                TestRazorCompiledItem.CreateForPage("/Pages/About.cshtml"),
                TestRazorCompiledItem.CreateForPage("/Pages/Home.cshtml"),
                // Page coming from the app
                TestRazorCompiledItem.CreateForPage("/Pages/About.cshtml"),
            };

            var provider = CreateProvider(items);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                context.RouteModels,
                result =>
            {
                Assert.Equal("/Pages/About.cshtml", result.RelativePath);
                Assert.Equal("/About", result.ViewEnginePath);
            },
                result =>
            {
                Assert.Equal("/Pages/Home.cshtml", result.RelativePath);
                Assert.Equal("/Home", result.ViewEnginePath);
            });
        }
        private void AddPageModels(PageRouteModelProviderContext context)
        {
            foreach (var item in _razorFileSystem.EnumerateItems(_pagesOptions.RootDirectory))
            {
                var relativePath = item.CombinedPath;
                if (context.RouteModels.Any(m => string.Equals(relativePath, m.RelativePath, StringComparison.OrdinalIgnoreCase)))
                {
                    // A route for this file was already registered either by the CompiledPageRouteModel or as an area route.
                    // by this provider. Skip registering an additional entry.

                    // Note: We're comparing duplicates based on root-relative paths. This eliminates a page from being discovered
                    // by overlapping area and non-area routes where ViewEnginePath would be different.
                    continue;
                }

                if (!PageDirectiveFeature.TryGetPageDirective(_logger, item, out var routeTemplate))
                {
                    // .cshtml pages without @page are not RazorPages.
                    continue;
                }

                if (_pagesOptions.AllowAreas && relativePath.StartsWith(AreaRootDirectory, StringComparison.OrdinalIgnoreCase))
                {
                    // Ignore Razor pages that are under the area root directory when AllowAreas is enabled.
                    // Conforming page paths will be added by AddAreaPageModels.
                    _logger.UnsupportedAreaPath(relativePath);
                    continue;
                }

                var routeModel = _routeModelFactory.CreateRouteModel(relativePath, routeTemplate);
                if (routeModel != null)
                {
                    context.RouteModels.Add(routeModel);
                }
            }
        }
        public void OnProvidersExecuting_DoesNotAddAreaAndNonAreaRoutesForAPage()
        {
            // Arrange
            var descriptors = new[]
            {
                CreateVersion_2_0_Descriptor("/Areas/Accounts/Pages/Manage/Home.cshtml"),
                CreateVersion_2_0_Descriptor("/Areas/Accounts/Manage/Home.cshtml"),
                CreateVersion_2_0_Descriptor("/Areas/About.cshtml"),
                CreateVersion_2_0_Descriptor("/Contact.cshtml"),
            };

            var options = new RazorPagesOptions
            {
                AllowAreas    = true,
                RootDirectory = "/",
            };

            var provider = CreateProvider(options: options, descriptors: descriptors);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                context.RouteModels,
                result =>
            {
                Assert.Equal("/Areas/Accounts/Pages/Manage/Home.cshtml", result.RelativePath);
                Assert.Equal("/Manage/Home", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Accounts/Manage/Home", selector.AttributeRouteModel.Template));
                Assert.Collection(
                    result.RouteValues.OrderBy(k => k.Key),
                    kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Accounts", kvp.Value);
                },
                    kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/Manage/Home", kvp.Value);
                });
            },
                result =>
            {
                Assert.Equal("/Contact.cshtml", result.RelativePath);
                Assert.Equal("/Contact", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Contact", selector.AttributeRouteModel.Template));
                Assert.Collection(
                    result.RouteValues.OrderBy(k => k.Key),
                    kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/Contact", kvp.Value);
                });
            });
        }
        public void OnProvidersExecuting_AddsModelsForCompiledAreaPages()
        {
            // Arrange
            var descriptors = new[]
            {
                CreateVersion_2_0_Descriptor("/Areas/Products/Files/About.cshtml"),
                CreateVersion_2_0_Descriptor("/Areas/Products/Pages/About.cshtml"),
                CreateVersion_2_0_Descriptor("/Areas/Products/Pages/Manage/Index.cshtml"),
                CreateVersion_2_0_Descriptor("/Areas/Products/Pages/Manage/Edit.cshtml", "{id}"),
            };

            var options = new RazorPagesOptions
            {
                AllowAreas = true,
                // Setting this value should not affect area page lookup.
                RootDirectory = "/Files",
            };

            var provider = CreateProvider(options: options, descriptors: descriptors);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                context.RouteModels,
                result =>
            {
                Assert.Equal("/Areas/Products/Pages/About.cshtml", result.RelativePath);
                Assert.Equal("/About", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Products/About", selector.AttributeRouteModel.Template));
                Assert.Collection(
                    result.RouteValues.OrderBy(k => k.Key),
                    kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                    kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/About", kvp.Value);
                });
            },
                result =>
            {
                Assert.Equal("/Areas/Products/Pages/Manage/Index.cshtml", result.RelativePath);
                Assert.Equal("/Manage/Index", result.ViewEnginePath);
                Assert.Collection(result.Selectors,
                                  selector => Assert.Equal("Products/Manage/Index", selector.AttributeRouteModel.Template),
                                  selector => Assert.Equal("Products/Manage", selector.AttributeRouteModel.Template));
                Assert.Collection(
                    result.RouteValues.OrderBy(k => k.Key),
                    kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                    kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/Manage/Index", kvp.Value);
                });
            },
                result =>
            {
                Assert.Equal("/Areas/Products/Pages/Manage/Edit.cshtml", result.RelativePath);
                Assert.Equal("/Manage/Edit", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Products/Manage/Edit/{id}", selector.AttributeRouteModel.Template));
                Assert.Collection(
                    result.RouteValues.OrderBy(k => k.Key),
                    kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                    kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/Manage/Edit", kvp.Value);
                });
            });
        }
        public void OnProvidersExecuting_AddsPagesUnderAreas()
        {
            // Arrange
            var fileSystem = new VirtualRazorProjectFileSystem();

            fileSystem.Add(new TestRazorProjectItem("/Areas/Products/Pages/Manage/Categories.cshtml", "@page"));
            fileSystem.Add(new TestRazorProjectItem("/Areas/Products/Pages/Index.cshtml", "@page"));
            fileSystem.Add(new TestRazorProjectItem("/Areas/Products/Pages/List.cshtml", "@page \"{sortOrder?}\""));
            fileSystem.Add(new TestRazorProjectItem("/Areas/Products/Pages/_Test.cshtml", "@page"));

            var optionsManager = Options.Create(new RazorPagesOptions {
                AllowAreas = true
            });
            var provider = new RazorProjectPageRouteModelProvider(fileSystem, optionsManager, NullLoggerFactory.Instance);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(context.RouteModels,
                              model =>
            {
                Assert.Equal("/Areas/Products/Pages/Index.cshtml", model.RelativePath);
                Assert.Equal("/Index", model.ViewEnginePath);
                Assert.Collection(model.Selectors,
                                  selector => Assert.Equal("Products/Index", selector.AttributeRouteModel.Template),
                                  selector => Assert.Equal("Products", selector.AttributeRouteModel.Template));
                Assert.Collection(model.RouteValues.OrderBy(k => k.Key),
                                  kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                                  kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/Index", kvp.Value);
                });
            },
                              model =>
            {
                Assert.Equal("/Areas/Products/Pages/List.cshtml", model.RelativePath);
                Assert.Equal("/List", model.ViewEnginePath);
                Assert.Collection(model.Selectors,
                                  selector => Assert.Equal("Products/List/{sortOrder?}", selector.AttributeRouteModel.Template));
                Assert.Collection(model.RouteValues.OrderBy(k => k.Key),
                                  kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                                  kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/List", kvp.Value);
                });
            },
                              model =>
            {
                Assert.Equal("/Areas/Products/Pages/_Test.cshtml", model.RelativePath);
                Assert.Equal("/_Test", model.ViewEnginePath);
                Assert.Collection(model.Selectors,
                                  selector => Assert.Equal("Products/_Test", selector.AttributeRouteModel.Template));
                Assert.Collection(model.RouteValues.OrderBy(k => k.Key),
                                  kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                                  kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/_Test", kvp.Value);
                });
            },
                              model =>
            {
                Assert.Equal("/Areas/Products/Pages/Manage/Categories.cshtml", model.RelativePath);
                Assert.Equal("/Manage/Categories", model.ViewEnginePath);
                Assert.Collection(model.Selectors,
                                  selector => Assert.Equal("Products/Manage/Categories", selector.AttributeRouteModel.Template));
                Assert.Collection(model.RouteValues.OrderBy(k => k.Key),
                                  kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                                  kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/Manage/Categories", kvp.Value);
                });
            });
        }
        public void OnProvidersExecuting_AddsModelsForCompiledAreaPages()
        {
            // Arrange
            var items = new[]
            {
                TestRazorCompiledItem.CreateForPage("/Areas/Products/Files/About.cshtml"),
                TestRazorCompiledItem.CreateForPage("/Areas/Products/Pages/About.cshtml"),
                TestRazorCompiledItem.CreateForPage("/Areas/Products/Pages/Manage/Index.cshtml"),
                TestRazorCompiledItem.CreateForPage("/Areas/Products/Pages/Manage/Edit.cshtml", metadata: new object[]
                {
                    new RazorCompiledItemMetadataAttribute("RouteTemplate", "{id}"),
                }),
            };

            var options = new RazorPagesOptions
            {
                // Setting this value should not affect area page lookup.
                RootDirectory = "/Files",
            };

            var provider = CreateProvider(items, options);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(
                context.RouteModels,
                result =>
            {
                Assert.Equal("/Areas/Products/Pages/About.cshtml", result.RelativePath);
                Assert.Equal("/About", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Products/About", selector.AttributeRouteModel.Template));
                Assert.Collection(
                    result.RouteValues.OrderBy(k => k.Key),
                    kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                    kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/About", kvp.Value);
                });
            },
                result =>
            {
                Assert.Equal("/Areas/Products/Pages/Manage/Index.cshtml", result.RelativePath);
                Assert.Equal("/Manage/Index", result.ViewEnginePath);
                Assert.Collection(result.Selectors,
                                  selector => Assert.Equal("Products/Manage/Index", selector.AttributeRouteModel.Template),
                                  selector => Assert.Equal("Products/Manage", selector.AttributeRouteModel.Template));
                Assert.Collection(
                    result.RouteValues.OrderBy(k => k.Key),
                    kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                    kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/Manage/Index", kvp.Value);
                });
            },
                result =>
            {
                Assert.Equal("/Areas/Products/Pages/Manage/Edit.cshtml", result.RelativePath);
                Assert.Equal("/Manage/Edit", result.ViewEnginePath);
                Assert.Collection(
                    result.Selectors,
                    selector => Assert.Equal("Products/Manage/Edit/{id}", selector.AttributeRouteModel.Template));
                Assert.Collection(
                    result.RouteValues.OrderBy(k => k.Key),
                    kvp =>
                {
                    Assert.Equal("area", kvp.Key);
                    Assert.Equal("Products", kvp.Value);
                },
                    kvp =>
                {
                    Assert.Equal("page", kvp.Key);
                    Assert.Equal("/Manage/Edit", kvp.Value);
                });
            });
        }
 public void OnProvidersExecuted(PageRouteModelProviderContext context)
 {
 }