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.RazorPages.Infrastructure;
|
||||
using Microsoft.Extensions.Internal;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
// 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.
|
||||
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
|
||||
using Microsoft.AspNetCore.Razor.Language;
|
||||
|
|
@ -24,8 +25,11 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
|||
_pagesOptions = pagesOptionsAccessor.Value;
|
||||
_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)
|
||||
{
|
||||
|
|
@ -47,6 +51,13 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
|||
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(
|
||||
relativePath: item.CombinedPath,
|
||||
viewEnginePath: item.FilePathWithoutExtension);
|
||||
|
|
@ -55,5 +66,20 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
|||
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);
|
||||
});
|
||||
}
|
||||
|
||||
[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