Do not re-discover runtime compiled RazorPage files for precompiled Razor Pages.

Fixes #6718
This commit is contained in:
Pranav K 2017-08-29 14:25:41 -07:00
parent b2f9ad1b67
commit b82200851f
3 changed files with 63 additions and 3 deletions

View File

@ -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
{ {

View File

@ -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;
@ -25,7 +26,10 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
_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;
}
} }
} }

View File

@ -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));
});
}
} }
} }