public CompiledPageRouteModelProvider(
     ApplicationPartManager applicationManager,
     IOptions <RazorPagesOptions> pagesOptionsAccessor)
 {
     _applicationManager = applicationManager;
     _pagesOptions       = pagesOptionsAccessor.Value;
 }
Example #2
0
        public void Configure_WithCustomRoot_AddsAreaPageViewLocationFormats()
        {
            // Arrange
            var expected = new[]
            {
                "/Areas/{2}/Pages/{1}/{0}.cshtml",
                "/Areas/{2}/Pages/Shared/{0}.cshtml",
                "/Areas/{2}/Views/Shared/{0}.cshtml",
                "/RazorFiles/Shared/{0}.cshtml",
                "/Views/Shared/{0}.cshtml",
            };

            var razorPagesOptions = new RazorPagesOptions
            {
                RootDirectory = "/RazorFiles/",
            };
            var viewEngineOptions = GetViewEngineOptions();
            var setup             = new RazorPagesRazorViewEngineOptionsSetup(
                Options.Options.Create(razorPagesOptions));

            // Act
            setup.Configure(viewEngineOptions);

            // Assert
            Assert.Equal(expected, viewEngineOptions.AreaPageViewLocationFormats);
        }
Example #3
0
        public void Configure_AddsSharedPagesDirectoryToAreaViewLocationFormats()
        {
            // Arrange
            var expected = new[]
            {
                "/Areas/{2}/Views/{1}/{0}.cshtml",
                "/Areas/{2}/Views/Shared/{0}.cshtml",
                "/Views/Shared/{0}.cshtml",
                "/PagesRoot/Shared/{0}.cshtml",
            };

            var razorPagesOptions = new RazorPagesOptions
            {
                RootDirectory = "/PagesRoot",
            };
            var viewEngineOptions = GetViewEngineOptions();
            var setup             = new RazorPagesRazorViewEngineOptionsSetup(
                new TestOptionsManager <RazorPagesOptions>(razorPagesOptions));

            // Act
            setup.Configure(viewEngineOptions);

            // Assert
            Assert.Equal(expected, viewEngineOptions.AreaViewLocationFormats);
        }
        public DefaultPageLoader(
            IOptions <RazorPagesOptions> options,
            RazorProject project,
            CSharpCompilationFactory compilationFactory,
            PageRazorEngineHost host,
            ITagHelperDescriptorResolver tagHelperDescriptorResolver)
        {
            _options            = options.Value;
            _project            = project;
            _compilationFactory = compilationFactory;
            _host = host;

            _tagHelperDescriptorResolver = tagHelperDescriptorResolver;

            _engine = RazorEngineBuilder.Build(builder =>
            {
                builder.Features.Add(new TagHelperFeature(_host.TagHelperDescriptorResolver));
                builder.Features.Add(new VirtualDocumentSyntaxTreePass());
                builder.Features.Add(new TagHelperBinderSyntaxTreePass());
                builder.Features.Add(new DefaultChunkTreeLoweringFeature(_host));

                builder.Features.Add(new PageDirectiveFeature()); // RazorPages-specific feature

                builder.Phases.Add(new DefaultSyntaxTreePhase());
                builder.Phases.Add(new DefaultChunkTreePhase());
                builder.Phases.Add(new DefaultCSharpSourceLoweringPhase(_host));
            });
        }
        public CompiledPageRouteModelProvider(
            ApplicationPartManager applicationManager,
            IOptions <RazorPagesOptions> pagesOptionsAccessor,
            RazorTemplateEngine templateEngine,
            ILoggerFactory loggerFactory)
        {
            if (applicationManager == null)
            {
                throw new ArgumentNullException(nameof(applicationManager));
            }

            if (pagesOptionsAccessor == null)
            {
                throw new ArgumentNullException(nameof(pagesOptionsAccessor));
            }

            if (templateEngine == null)
            {
                throw new ArgumentNullException(nameof(templateEngine));
            }

            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }

            _applicationManager = applicationManager;
            _pagesOptions       = pagesOptionsAccessor.Value;
            _templateEngine     = templateEngine;
            _logger             = loggerFactory.CreateLogger <CompiledPageRouteModelProvider>();
        }
        public void OnProvidersExecuting_DoesNotAddsModelsForAreaPages_IfFeatureIsDisabled()
        {
            // Arrange
            var descriptors = new[]
            {
                GetDescriptor("/Pages/About.cshtml"),
                GetDescriptor("/Areas/Accounts/Pages/Home.cshtml"),
            };
            var options = new RazorPagesOptions {
                EnableAreas = false
            };
            var provider = new TestCompiledPageRouteModelProvider(descriptors, options);
            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 CreateRouteModel_DoesNotAddMultipleSelectorsWhenRouteTemplateIsAbsolute()
        {
            // Arrange
            var relativePath      = "/Pages/Users/Profile/Index.cshtml";
            var options           = new RazorPagesOptions();
            var routeModelFactory = new PageRouteModelFactory(options, NullLogger.Instance);

            // Act
            var routeModel = routeModelFactory.CreateRouteModel(relativePath, "/my-override");

            // Assert
            Assert.Equal(relativePath, routeModel.RelativePath);
            Assert.Equal("/Users/Profile/Index", routeModel.ViewEnginePath);

            Assert.Collection(
                routeModel.Selectors,
                selector => Assert.Equal("my-override", selector.AttributeRouteModel.Template));

            Assert.Collection(
                routeModel.RouteValues,
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/Users/Profile/Index", kvp.Value);
            });
        }
        public void CreateAreaRouteModel_AddsSelector()
        {
            // Arrange
            var relativePath      = "/Areas/TestArea/Pages/Users/Profile.cshtml";
            var options           = new RazorPagesOptions();
            var routeModelFactory = new PageRouteModelFactory(options, NullLogger.Instance);

            // Act
            var routeModel = routeModelFactory.CreateAreaRouteModel(relativePath, "{id?}");

            // Assert
            Assert.Equal(relativePath, routeModel.RelativePath);
            Assert.Equal("/Users/Profile", routeModel.ViewEnginePath);
            Assert.Equal("TestArea", routeModel.AreaName);

            Assert.Collection(
                routeModel.Selectors,
                selector => Assert.Equal("TestArea/Users/Profile/{id?}", selector.AttributeRouteModel.Template));

            Assert.Collection(
                routeModel.RouteValues.OrderBy(kvp => kvp.Key),
                kvp =>
            {
                Assert.Equal("area", kvp.Key);
                Assert.Equal("TestArea", kvp.Value);
            },
                kvp =>
            {
                Assert.Equal("page", kvp.Key);
                Assert.Equal("/Users/Profile", kvp.Value);
            });
        }
Example #9
0
 public static void UnsupportedAreaPath(this ILogger logger, RazorPagesOptions options, string filePath)
 {
     if (logger.IsEnabled(LogLevel.Warning))
     {
         _unsupportedAreaPath(logger, filePath, options.AreaRootDirectory, options.AreaRootDirectory, options.RootDirectory, null);
     }
 }
        public MockPageRouteModel(RazorPagesOptions options)
        {
            _options = options ?? throw new ArgumentNullException(nameof(options));

            _normalizedRootDirectory     = NormalizeDirectory(options.RootDirectory);
            _normalizedAreaRootDirectory = "/Areas/";
        }
Example #11
0
        public DefaultPageLoader(
            IOptions <RazorPagesOptions> options,
            RazorProject project,
            CSharpCompilationFactory compilationFactory,
            PageRazorEngineHost host,
            ITagHelperDescriptorResolver tagHelperDescriptorResolver)
        {
            _options            = options.Value;
            _project            = project;
            _compilationFactory = compilationFactory;
            _host = host;

            _tagHelperDescriptorResolver = tagHelperDescriptorResolver;

            // TODO: Code smell, this is newed up in several locations. We should find a unified location for this.
            var attributeContext = new GeneratedTagHelperAttributeContext()
            {
                CreateModelExpressionMethodName     = "CreateModelExpression",
                ModelExpressionProviderPropertyName = "ModelExpressionProvider",
                ModelExpressionTypeName             = "Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression",
                ViewDataPropertyName = "ViewData",
            };

            _engine = RazorEngineBuilder.Build(builder =>
            {
                builder.Features.Add(new TagHelperFeature(_host.TagHelperDescriptorResolver));
                builder.Features.Add(new VirtualDocumentSyntaxTreePass());
                builder.Features.Add(new TagHelperBinderSyntaxTreePass());

                builder.Features.Add(new InstrumentationPass(_host));
                builder.Features.Add(new PreallocatedTagHelperAttributePass());

                // MVC specific features
                builder.Features.Add(new ModelExpressionAttributePass(attributeContext));
                builder.Features.Add(new InjectDirectiveRenderer(typeof(RazorInjectAttribute).FullName));

                builder.Features.Add(new DefaultChunkTreeLoweringFeature(_host));
                builder.Features.Add(new DefaultCSharpSourceLoweringFeature(_host));

                // Renderers
                builder.Features.Add(new RuntimeCSharpRenderer());
                builder.Features.Add(new PageStructureCSharpRenderer());

                builder.Features.Add(new PageDirectiveFeature()); // RazorPages-specific feature
                builder.Features.Add(new PagesPropertyInjectionPass());
                builder.Features.Add(new RazorDirectiveDiscoveryPass());

                builder.Phases.Add(new DefaultSyntaxTreePhase());
                builder.Phases.Add(new DefaultChunkTreePhase());

                // New Razor generation phases.
                builder.Phases.Add(new DefaultCSharpSourceLoweringPhase());
                builder.Phases.Add(new DefaultCSharpDocumentGenerationPhase(_host));

                // Uncomment the below line to force old-style view rendering.
                // builder.Phases.Add(new Razevolution.DefaultCSharpSourceLoweringPhase(_host));
            });
        }
Example #12
0
        public void PostConfigure(string name, RazorPagesOptions options)
        {
            name    = name ?? throw new ArgumentNullException(nameof(name));
            options = options ?? throw new ArgumentNullException(nameof(options));

            var convention = new GenericPageModelConvention <TEntity, TKey>();

            options.Conventions.AddFolderApplicationModelConvention("/", pam => convention.Apply(pam));
        }
 public CompiledPageRouteModelProvider(
     ApplicationPartManager applicationManager,
     IOptions <RazorPagesOptions> pagesOptionsAccessor,
     ILoggerFactory loggerFactory)
 {
     _applicationManager = applicationManager;
     _pagesOptions       = pagesOptionsAccessor.Value;
     _logger             = loggerFactory.CreateLogger <CompiledPageRouteModelProvider>();
 }
Example #14
0
 public RazorProjectPageRouteModelProvider(
     RazorProject razorProject,
     IOptions <RazorPagesOptions> pagesOptionsAccessor,
     ILoggerFactory loggerFactory)
 {
     _project      = razorProject;
     _pagesOptions = pagesOptionsAccessor.Value;
     _logger       = loggerFactory.CreateLogger <RazorProjectPageRouteModelProvider>();
 }
 public PageActionDescriptorProvider(
     RazorProject project,
     IOptions <MvcOptions> options,
     IOptions <RazorPagesOptions> pagesOptions)
 {
     _project      = project;
     _options      = options.Value;
     _pagesOptions = pagesOptions.Value;
 }
Example #16
0
 public CompiledPageRouteModelProvider(
     ApplicationPartManager applicationManager,
     IOptions <RazorPagesOptions> pagesOptionsAccessor,
     ILogger <CompiledPageRouteModelProvider> logger)
 {
     _applicationManager = applicationManager ?? throw new ArgumentNullException(nameof(applicationManager));
     _pagesOptions       = pagesOptionsAccessor?.Value ?? throw new ArgumentNullException(nameof(pagesOptionsAccessor));
     _routeModelFactory  = new PageRouteModelFactory(_pagesOptions, logger);
 }
 public CompiledPageActionDescriptorFactory(
     IEnumerable <IPageApplicationModelProvider> applicationModelProviders,
     MvcOptions mvcOptions,
     RazorPagesOptions pageOptions)
 {
     _applicationModelProviders = applicationModelProviders.OrderBy(a => a.Order).ToArray();
     _conventions   = pageOptions.Conventions;
     _globalFilters = mvcOptions.Filters;
 }
Example #18
0
        public PageRouteModelFactory(RazorPagesOptions options, string rootDirectory, string areaRootDirectory, ILogger logger)
        {
            var razorPagesOptions = options;

            _options = razorPagesOptions ?? throw new ArgumentNullException(nameof(options));
            _logger  = logger ?? throw new ArgumentNullException(nameof(logger));

            _normalizedRootDirectory     = rootDirectory.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
            _normalizedAreaRootDirectory = areaRootDirectory.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
        }
        public PageRouteModelFactory(
            RazorPagesOptions options,
            ILogger logger)
        {
            _options = options ?? throw new ArgumentNullException(nameof(options));
            _logger  = logger ?? throw new ArgumentNullException(nameof(logger));

            _normalizedRootDirectory     = NormalizeDirectory(options.RootDirectory);
            _normalizedAreaRootDirectory = "/Areas/";
        }
Example #20
0
 public RazorProjectPageRouteModelProvider(
     RazorProjectFileSystem razorFileSystem,
     IOptions <RazorPagesOptions> pagesOptionsAccessor,
     ILoggerFactory loggerFactory)
 {
     _razorFileSystem   = razorFileSystem;
     _pagesOptions      = pagesOptionsAccessor.Value;
     _logger            = loggerFactory.CreateLogger <RazorProjectPageRouteModelProvider>();
     _routeModelFactory = new PageRouteModelFactory(_pagesOptions, _logger);
 }
Example #21
0
        public void OnProvidersExecuting_DoesNotAddAreaAndNonAreaRoutesForAPage()
        {
            // Arrange
            var descriptors = new[]
            {
                GetDescriptor("/Areas/Accounts/Manage/Home.cshtml"),
                GetDescriptor("/Areas/About.cshtml"),
                GetDescriptor("/Contact.cshtml"),
            };
            var options = new RazorPagesOptions
            {
                AllowAreas        = true,
                AreaRootDirectory = "/Areas",
                RootDirectory     = "/",
            };
            var provider = new TestCompiledPageRouteModelProvider(descriptors, options);
            var context  = new PageRouteModelProviderContext();

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.Collection(context.RouteModels,
                              result =>
            {
                Assert.Equal("/Areas/Accounts/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 DefaultPageApplicationModelProvider(
            IModelMetadataProvider modelMetadataProvider,
            IOptions <RazorPagesOptions> razorPagesOptions)
        {
            _modelMetadataProvider = modelMetadataProvider;
            _razorPagesOptions     = razorPagesOptions.Value;

            _supportsAllRequests         = _ => true;
            _supportsNonGetRequests      = context => !HttpMethods.IsGet(context.HttpContext.Request.Method);
            _handleOptionsRequestsFilter = new HandleOptionsRequestsPageFilter();
        }
    public DefaultPageApplicationModelProvider(
        IModelMetadataProvider modelMetadataProvider,
        IOptions <RazorPagesOptions> razorPagesOptions,
        IPageApplicationModelPartsProvider pageApplicationModelPartsProvider)
    {
        _modelMetadataProvider             = modelMetadataProvider;
        _razorPagesOptions                 = razorPagesOptions.Value;
        _pageApplicationModelPartsProvider = pageApplicationModelPartsProvider;

        _handleOptionsRequestsFilter = new HandleOptionsRequestsPageFilter();
    }
Example #24
0
        public CompiledPageRouteModelProviderTest()
        {
            FileProvider = new TestFileProvider();
            Project      = new FileProviderRazorProject(
                Mock.Of <IRazorViewEngineFileProviderAccessor>(a => a.FileProvider == FileProvider),
                Mock.Of <IHostingEnvironment>(e => e.ContentRootPath == "BasePath"));
            TemplateEngine = new RazorTemplateEngine(RazorEngine.Create(), Project);

            PagesOptions = new RazorPagesOptions();
            Provider     = new TestCompiledPageRouteModelProvider(new ApplicationPartManager(), Options.Create(PagesOptions), TemplateEngine, NullLoggerFactory.Instance);
        }
Example #25
0
        public void TryParseAreaPath_ReturnsFalse_IfPathDoesNotBelongToRootDirectory(string path)
        {
            // Arrange
            var options = new RazorPagesOptions();

            // Act
            var success = PageSelectorModel.TryParseAreaPath(options, path, NullLogger.Instance, out _);

            // Assert
            Assert.False(success);
        }
        public void TryParseAreaPath_ReturnsFalse_IfPathDoesNotBelongToRootDirectory(string path)
        {
            // Arrange
            var options           = new RazorPagesOptions();
            var routeModelFactory = new PageRouteModelFactory(options, NullLogger.Instance);

            // Act
            var success = routeModelFactory.TryParseAreaPath(path, out _);

            // Assert
            Assert.False(success);
        }
        public void PostConfigure(string name, RazorPagesOptions options)
        {
            name    = name ?? throw new ArgumentNullException(nameof(name));
            options = options ?? throw new ArgumentNullException(nameof(options));

            options.AllowAreas = true;
            options.Conventions.AuthorizeAreaFolder(IdentityUIAdminAreaName, "/Account/Manage");
            options.Conventions.AuthorizeAreaPage(IdentityUIAdminAreaName, "/Account/Logout");
            var convention = new IdentityPageModelConvention <TUser, TRole>();

            options.Conventions.AddAreaFolderApplicationModelConvention(
                IdentityUIAdminAreaName,
                "/",
                pam => convention.Apply(pam));
        }
        private TestCompiledPageRouteModelProvider CreateProvider(
            RazorPagesOptions options = null,
            IList <CompiledViewDescriptor> descriptors = null)
        {
            options = options ?? new RazorPagesOptions();

            var provider = new TestCompiledPageRouteModelProvider(
                new ApplicationPartManager(),
                Options.Create(options),
                NullLogger <CompiledPageRouteModelProvider> .Instance);

            provider.Descriptors.AddRange(descriptors ?? Array.Empty <CompiledViewDescriptor>());

            return(provider);
        }
Example #29
0
        public RuntimeRazorPageLoaderTests()
        {
            var actionDescriptors = new ActionDescriptorCollection(Array.Empty <ActionDescriptor>(), 1);

            ActionDescriptorCollectionProvider = Mock.Of <IActionDescriptorCollectionProvider>(v => v.ActionDescriptors == actionDescriptors);

            // The f*cking constructor is internal..
            var conventions = Activator.CreateInstance(typeof(PageConventionCollection), BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { Mock.Of <IServiceProvider>() }, null);

            // so is the property setter FFS.
            var options = new RazorPagesOptions();

            typeof(RazorPagesOptions).GetProperty("Conventions", BindingFlags.Public | BindingFlags.Instance).SetValue(options, conventions);

            RazorPagesOptions = Options.Create(options);
        }
        public void TryParseAreaPath_ParsesAreaPath(
            string path,
            string expectedArea,
            string expectedViewEnginePath)
        {
            // Arrange
            var options           = new RazorPagesOptions();
            var routeModelFactory = new PageRouteModelFactory(options, NullLogger.Instance);

            // Act
            var success = routeModelFactory.TryParseAreaPath(path, out var result);

            // Assert
            Assert.True(success);
            Assert.Equal(expectedArea, result.areaName);
            Assert.Equal(expectedViewEnginePath, result.viewEnginePath);
        }