diff --git a/build/dependencies.props b/build/dependencies.props index c028e77ed2..c7895751bb 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -5,80 +5,80 @@ 0.10.13 2.1.0-preview2-15744 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 5.2.4 2.6.1 2.6.1 - 2.1.0-preview2-30355 + 2.1.0-preview2-30479 1.7.0 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 2.1.0-preview2-26313-01 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 2.0.0 2.1.0-preview2-26314-02 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 15.6.0 + 2.1.0-preview2-30479 + 2.1.0-preview2-30479 + 15.6.1 4.7.49 1.0.1 4.5.0-preview2-26313-01 diff --git a/src/Microsoft.AspNetCore.Mvc.Razor/ApplicationParts/RazorCompiledItemFeatureProvider.cs b/src/Microsoft.AspNetCore.Mvc.Razor/ApplicationParts/RazorCompiledItemFeatureProvider.cs index 5e39299d1d..d59c4e9ffb 100644 --- a/src/Microsoft.AspNetCore.Mvc.Razor/ApplicationParts/RazorCompiledItemFeatureProvider.cs +++ b/src/Microsoft.AspNetCore.Mvc.Razor/ApplicationParts/RazorCompiledItemFeatureProvider.cs @@ -36,18 +36,10 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts foreach (var item in provider.CompiledItems) { - var descriptor = GetCompiledViewDescriptor(item); + var descriptor = new CompiledViewDescriptor(item, attribute: null); feature.ViewDescriptors.Add(descriptor); } } } - - private static CompiledViewDescriptor GetCompiledViewDescriptor(RazorCompiledItem item) - { - var itemAssembly = item.Type.Assembly; - var razorViewAttribute = itemAssembly.GetCustomAttributes() - .FirstOrDefault(attribute => attribute.ViewType == item.Type); - return new CompiledViewDescriptor(item, razorViewAttribute); - } } } diff --git a/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/CompiledPageRouteModelProvider.cs b/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/CompiledPageRouteModelProvider.cs index 94ca98b2b2..7f87b10f41 100644 --- a/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/CompiledPageRouteModelProvider.cs +++ b/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/CompiledPageRouteModelProvider.cs @@ -7,8 +7,10 @@ using System.Linq; using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.Razor.Compilation; +using Microsoft.AspNetCore.Mvc.Razor.Extensions; using Microsoft.AspNetCore.Mvc.Razor.Internal; using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure; +using Microsoft.AspNetCore.Razor.Hosting; using Microsoft.AspNetCore.Razor.Language; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -96,18 +98,19 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal continue; } - var pageAttribute = (RazorPageAttribute)viewDescriptor.ViewAttribute; + 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 && viewDescriptor.RelativePath.StartsWith(areaRootDirectory, StringComparison.OrdinalIgnoreCase)) + if (_pagesOptions.AllowAreas && relativePath.StartsWith(areaRootDirectory, StringComparison.OrdinalIgnoreCase)) { - routeModel = _routeModelFactory.CreateAreaRouteModel(viewDescriptor.RelativePath, pageAttribute.RouteTemplate); + routeModel = _routeModelFactory.CreateAreaRouteModel(relativePath, routeTemplate); } - else if (viewDescriptor.RelativePath.StartsWith(rootDirectory, StringComparison.OrdinalIgnoreCase)) + else if (relativePath.StartsWith(rootDirectory, StringComparison.OrdinalIgnoreCase)) { - routeModel = _routeModelFactory.CreateRouteModel(pageAttribute.Path, pageAttribute.RouteTemplate); + routeModel = _routeModelFactory.CreateRouteModel(relativePath, routeTemplate); } if (routeModel != null) @@ -116,5 +119,23 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal } } } + + internal static string GetRouteTemplate(CompiledViewDescriptor viewDescriptor) + { + if (viewDescriptor.ViewAttribute != null) + { + return ((RazorPageAttribute)viewDescriptor.ViewAttribute).RouteTemplate; + } + + if (viewDescriptor.Item != null) + { + return viewDescriptor.Item.Metadata + .OfType() + .FirstOrDefault(f => f.Key == RazorPageDocumentClassifierPass.RouteTemplateKey) + ?.Value; + } + + return null; + } } } diff --git a/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/Internal/CompiledPageRouteModelProviderTest.cs b/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/Internal/CompiledPageRouteModelProviderTest.cs index 54ffc34a98..8bf1090f43 100644 --- a/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/Internal/CompiledPageRouteModelProviderTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/Internal/CompiledPageRouteModelProviderTest.cs @@ -82,7 +82,10 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal var descriptors = new[] { CreateVersion_2_1_Descriptor("/Pages/About.cshtml"), - CreateVersion_2_1_Descriptor("/Pages/Home.cshtml", "some-prefix"), + CreateVersion_2_1_Descriptor("/Pages/Home.cshtml", metadata: new[] + { + new RazorCompiledItemMetadataAttribute("RouteTemplate", "some-prefix"), + }), }; var provider = CreateProvider(descriptors: descriptors); @@ -515,6 +518,63 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal }); } + [Fact] + public void GetRouteTemplate_ReturnsPathFromRazorPageAttribute() + { + // Arrange + var expected = "test"; + var descriptor = CreateVersion_2_0_Descriptor("/Pages/Home.cshtml", expected); + + // Act + var result = CompiledPageRouteModelProvider.GetRouteTemplate(descriptor); + + // Assert + Assert.Equal(expected, result); + } + + [Fact] + public void GetRouteTemplate_ReturnsNull_IfPageAttributeDoesNotHaveTemplate() + { + // Arrange + var descriptor = CreateVersion_2_0_Descriptor("/Pages/Home.cshtml", routeTemplate: null); + + // Act + var result = CompiledPageRouteModelProvider.GetRouteTemplate(descriptor); + + // Assert + Assert.Null(result); + } + + [Fact] + public void GetRouteTemplate_ReturnsPathFromMetadataAttribute() + { + // Arrange + var expected = "test"; + var descriptor = CreateVersion_2_1_Descriptor("/Pages/About.cshtml", metadata: new object[] + { + new RazorCompiledItemMetadataAttribute("RouteTemplate", expected), + }); + + // Act + var result = CompiledPageRouteModelProvider.GetRouteTemplate(descriptor); + + // Assert + Assert.Equal(expected, result); + } + + [Fact] + public void GetRouteTemplate_ReturnsNull_IfAttributeDoesNotExist() + { + // Arrange + var descriptor = CreateVersion_2_1_Descriptor("/Pages/About.cshtml"); + + // Act + var result = CompiledPageRouteModelProvider.GetRouteTemplate(descriptor); + + // Assert + Assert.Null(result); + } + private TestCompiledPageRouteModelProvider CreateProvider( RazorPagesOptions options = null, IList descriptors = null, @@ -549,13 +609,11 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal private static CompiledViewDescriptor CreateVersion_2_1_Descriptor( string path, - string routeTemplate = "", object[] metadata = null) { return new CompiledViewDescriptor { RelativePath = path, - ViewAttribute = new RazorPageAttribute(path, typeof(object), routeTemplate), Item = new TestRazorCompiledItem(typeof(object), "mvc.1.0.razor-page", path, metadata ?? Array.Empty()), }; }