Do not re-discover runtime compiled RazorPage files for precompiled Razor Pages.
Fixes #6718
This commit is contained in:
parent
b2f9ad1b67
commit
b82200851f
|
|
@ -9,7 +9,6 @@ using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.Mvc.Razor;
|
using Microsoft.AspNetCore.Mvc.Razor;
|
||||||
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
|
||||||
using Microsoft.Extensions.Internal;
|
using Microsoft.Extensions.Internal;
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
||||||
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Razor.Language;
|
using Microsoft.AspNetCore.Razor.Language;
|
||||||
|
|
@ -24,8 +25,11 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
_pagesOptions = pagesOptionsAccessor.Value;
|
_pagesOptions = pagesOptionsAccessor.Value;
|
||||||
_logger = loggerFactory.CreateLogger<RazorProjectPageRouteModelProvider>();
|
_logger = loggerFactory.CreateLogger<RazorProjectPageRouteModelProvider>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Order => -1000;
|
/// <remarks>
|
||||||
|
/// Ordered to execute after <see cref="CompiledPageRouteModelProvider"/>.
|
||||||
|
/// </remarks>
|
||||||
|
public int Order => -1000 + 10;
|
||||||
|
|
||||||
public void OnProvidersExecuted(PageRouteModelProviderContext context)
|
public void OnProvidersExecuted(PageRouteModelProviderContext context)
|
||||||
{
|
{
|
||||||
|
|
@ -47,6 +51,13 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsAlreadyRegistered(context, item))
|
||||||
|
{
|
||||||
|
// The CompiledPageRouteModelProvider (or another provider) already registered a PageRoute for this path.
|
||||||
|
// Don't register a duplicate entry for this route.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
var routeModel = new PageRouteModel(
|
var routeModel = new PageRouteModel(
|
||||||
relativePath: item.CombinedPath,
|
relativePath: item.CombinedPath,
|
||||||
viewEnginePath: item.FilePathWithoutExtension);
|
viewEnginePath: item.FilePathWithoutExtension);
|
||||||
|
|
@ -55,5 +66,20 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
context.RouteModels.Add(routeModel);
|
context.RouteModels.Add(routeModel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool IsAlreadyRegistered(PageRouteModelProviderContext context, RazorProjectItem projectItem)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < context.RouteModels.Count; i++)
|
||||||
|
{
|
||||||
|
var routeModel = context.RouteModels[i];
|
||||||
|
if (string.Equals(routeModel.ViewEnginePath, projectItem.FilePathWithoutExtension, StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
string.Equals(routeModel.RelativePath, projectItem.CombinedPath, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -176,5 +176,40 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
Assert.Equal("/Pages/Index.cshtml", model.RelativePath);
|
Assert.Equal("/Pages/Index.cshtml", model.RelativePath);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void OnProvidersExecuting_DoesNotAddPageDirectivesIfItAlreadyExists()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var fileProvider = new TestFileProvider();
|
||||||
|
var file1 = fileProvider.AddFile("/Pages/Home.cshtml", "@page");
|
||||||
|
var file2 = fileProvider.AddFile("/Pages/Test.cshtml", "@page");
|
||||||
|
|
||||||
|
var dir1 = fileProvider.AddDirectoryContent("/Pages", new IFileInfo[] { file1, file2 });
|
||||||
|
fileProvider.AddDirectoryContent("/", new[] { dir1 });
|
||||||
|
|
||||||
|
var project = new TestRazorProject(fileProvider);
|
||||||
|
|
||||||
|
var optionsManager = new TestOptionsManager<RazorPagesOptions>();
|
||||||
|
optionsManager.Value.RootDirectory = "/";
|
||||||
|
var provider = new RazorProjectPageRouteModelProvider(project, optionsManager, NullLoggerFactory.Instance);
|
||||||
|
var context = new PageRouteModelProviderContext();
|
||||||
|
var pageModel = new PageRouteModel("/Pages/Test.cshtml", "/Pages/Test");
|
||||||
|
context.RouteModels.Add(pageModel);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
provider.OnProvidersExecuting(context);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Collection(context.RouteModels,
|
||||||
|
model => Assert.Same(pageModel, model),
|
||||||
|
model =>
|
||||||
|
{
|
||||||
|
Assert.Equal("/Pages/Home.cshtml", model.RelativePath);
|
||||||
|
Assert.Equal("/Pages/Home", model.ViewEnginePath);
|
||||||
|
Assert.Collection(model.Selectors,
|
||||||
|
selector => Assert.Equal("Pages/Home", selector.AttributeRouteModel.Template));
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue