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.RazorPages.Infrastructure;
using Microsoft.Extensions.Internal;
using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
{

View File

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

View File

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