Merge branch 'release/2.1' into dev
This commit is contained in:
commit
f55730676b
|
|
@ -58,22 +58,55 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
private IEnumerable<CompiledViewDescriptor> GetViewDescriptors(ApplicationPartManager applicationManager)
|
||||||
/// Gets the sequence of <see cref="CompiledViewDescriptor"/> from <paramref name="applicationManager"/>.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="applicationManager">The <see cref="ApplicationPartManager"/>s</param>
|
|
||||||
/// <returns>The sequence of <see cref="CompiledViewDescriptor"/>.</returns>
|
|
||||||
protected virtual IEnumerable<CompiledViewDescriptor> GetViewDescriptors(ApplicationPartManager applicationManager)
|
|
||||||
{
|
{
|
||||||
if (applicationManager == null)
|
if (applicationManager == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(applicationManager));
|
throw new ArgumentNullException(nameof(applicationManager));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var viewsFeature = GetViewFeature(applicationManager);
|
||||||
|
|
||||||
|
var visited = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
foreach (var viewDescriptor in viewsFeature.ViewDescriptors)
|
||||||
|
{
|
||||||
|
if (!visited.Add(viewDescriptor.RelativePath))
|
||||||
|
{
|
||||||
|
// Already seen an descriptor with a higher "order"
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!viewDescriptor.IsPrecompiled)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsRazorPage(viewDescriptor))
|
||||||
|
{
|
||||||
|
yield return viewDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsRazorPage(CompiledViewDescriptor viewDescriptor)
|
||||||
|
{
|
||||||
|
if (viewDescriptor.Item != null)
|
||||||
|
{
|
||||||
|
return viewDescriptor.Item.Kind == RazorPageDocumentClassifierPass.RazorPageDocumentKind;
|
||||||
|
}
|
||||||
|
else if (viewDescriptor.ViewAttribute != null)
|
||||||
|
{
|
||||||
|
return viewDescriptor.ViewAttribute is RazorPageAttribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual ViewsFeature GetViewFeature(ApplicationPartManager applicationManager)
|
||||||
|
{
|
||||||
var viewsFeature = new ViewsFeature();
|
var viewsFeature = new ViewsFeature();
|
||||||
applicationManager.PopulateFeature(viewsFeature);
|
applicationManager.PopulateFeature(viewsFeature);
|
||||||
|
return viewsFeature;
|
||||||
return viewsFeature.ViewDescriptors.Where(d => d.IsPrecompiled && d.ViewAttribute is RazorPageAttribute);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateModels(PageRouteModelProviderContext context)
|
private void CreateModels(PageRouteModelProviderContext context)
|
||||||
|
|
|
||||||
|
|
@ -484,5 +484,25 @@ Hello from /Pages/Shared/";
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Contains("Name is required", response);
|
Assert.Contains("Name is required", response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task PagesFromClassLibraries_CanBeServed()
|
||||||
|
{
|
||||||
|
// Act
|
||||||
|
var response = await Client.GetStringAsync("/ClassLibraryPages/Served");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Contains("This page is served from RazorPagesClassLibrary", response);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task PagesFromClassLibraries_CanBeOverriden()
|
||||||
|
{
|
||||||
|
// Act
|
||||||
|
var response = await Client.GetStringAsync("/ClassLibraryPages/Overriden");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Contains("This page is overriden by RazorPagesWebSite", response);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -518,6 +518,53 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
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 prefered
|
||||||
|
// to a Razor Page added by a library.
|
||||||
|
|
||||||
|
// Arrange
|
||||||
|
var descriptors = new[]
|
||||||
|
{
|
||||||
|
// Page coming from the app
|
||||||
|
CreateVersion_2_1_Descriptor("/Pages/About.cshtml", metadata: new object[]
|
||||||
|
{
|
||||||
|
new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Pages/About.cshtml"),
|
||||||
|
}),
|
||||||
|
CreateVersion_2_1_Descriptor("/Pages/Home.cshtml", metadata: new object[]
|
||||||
|
{
|
||||||
|
new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Pages/Index.cshtml"),
|
||||||
|
}),
|
||||||
|
// Page coming from the app
|
||||||
|
CreateVersion_2_1_Descriptor("/Pages/About.cshtml", metadata: new object[]
|
||||||
|
{
|
||||||
|
new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Pages/About.cshtml"),
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
|
||||||
|
var provider = CreateProvider(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);
|
||||||
|
},
|
||||||
|
result =>
|
||||||
|
{
|
||||||
|
Assert.Equal("/Pages/Home.cshtml", result.RelativePath);
|
||||||
|
Assert.Equal("/Home", result.ViewEnginePath);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void GetRouteTemplate_ReturnsPathFromRazorPageAttribute()
|
public void GetRouteTemplate_ReturnsPathFromRazorPageAttribute()
|
||||||
{
|
{
|
||||||
|
|
@ -602,6 +649,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
{
|
{
|
||||||
return new CompiledViewDescriptor
|
return new CompiledViewDescriptor
|
||||||
{
|
{
|
||||||
|
IsPrecompiled = true,
|
||||||
RelativePath = path,
|
RelativePath = path,
|
||||||
ViewAttribute = new RazorPageAttribute(path, typeof(object), routeTemplate),
|
ViewAttribute = new RazorPageAttribute(path, typeof(object), routeTemplate),
|
||||||
};
|
};
|
||||||
|
|
@ -613,6 +661,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
{
|
{
|
||||||
return new CompiledViewDescriptor
|
return new CompiledViewDescriptor
|
||||||
{
|
{
|
||||||
|
IsPrecompiled = true,
|
||||||
RelativePath = path,
|
RelativePath = path,
|
||||||
Item = new TestRazorCompiledItem(typeof(object), "mvc.1.0.razor-page", path, metadata ?? Array.Empty<object>()),
|
Item = new TestRazorCompiledItem(typeof(object), "mvc.1.0.razor-page", path, metadata ?? Array.Empty<object>()),
|
||||||
};
|
};
|
||||||
|
|
@ -631,7 +680,16 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
|
|
||||||
public List<CompiledViewDescriptor> Descriptors { get; } = new List<CompiledViewDescriptor>();
|
public List<CompiledViewDescriptor> Descriptors { get; } = new List<CompiledViewDescriptor>();
|
||||||
|
|
||||||
protected override IEnumerable<CompiledViewDescriptor> GetViewDescriptors(ApplicationPartManager applicationManager) => Descriptors;
|
protected override ViewsFeature GetViewFeature(ApplicationPartManager applicationManager)
|
||||||
|
{
|
||||||
|
var feature = new ViewsFeature();
|
||||||
|
foreach (var descriptor in Descriptors)
|
||||||
|
{
|
||||||
|
feature.ViewDescriptors.Add(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return feature;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
@page
|
||||||
|
@{ throw new Exception("This page should be overriden by the application."); }
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
@page
|
||||||
|
This page is served from RazorPagesClassLibrary
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>netstandard2.0</TargetFrameworks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
@page
|
||||||
|
This page is overriden by RazorPagesWebSite
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj" />
|
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj" />
|
||||||
|
<ProjectReference Include="..\RazorPagesClassLibrary\RazorPagesClassLibrary.csproj" />
|
||||||
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="$(MicrosoftAspNetCoreAuthenticationCookiesPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="$(MicrosoftAspNetCoreAuthenticationCookiesPackageVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="$(MicrosoftAspNetCoreServerIISIntegrationPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="$(MicrosoftAspNetCoreServerIISIntegrationPackageVersion)" />
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue