diff --git a/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/DefaultPageLoader.cs b/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/DefaultPageLoader.cs index bfce828103..28ccd85e37 100644 --- a/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/DefaultPageLoader.cs +++ b/src/Microsoft.AspNetCore.Mvc.RazorPages/Internal/DefaultPageLoader.cs @@ -23,7 +23,9 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal IViewCompilerProvider viewCompilerProvider, IOptions pageOptions) { - _applicationModelProviders = applicationModelProviders.ToArray(); + _applicationModelProviders = applicationModelProviders + .OrderBy(p => p.Order) + .ToArray(); _viewCompilerProvider = viewCompilerProvider; _conventions = pageOptions.Value.Conventions .OfType() diff --git a/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/Internal/DefaultPageLoaderTest.cs b/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/Internal/DefaultPageLoaderTest.cs index 771fd40055..2530d1e003 100644 --- a/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/Internal/DefaultPageLoaderTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.RazorPages.Test/Internal/DefaultPageLoaderTest.cs @@ -81,6 +81,67 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal provider2.Verify(); } + [Fact] + public void Load_InvokesApplicationModelProviders_WithTheRightOrder() + { + // Arrange + var descriptor = new PageActionDescriptor(); + var compilerProvider = GetCompilerProvider(); + var options = new TestOptionsManager(); + + var provider1 = new Mock(); + provider1.SetupGet(p => p.Order).Returns(10); + var provider2 = new Mock(); + provider2.SetupGet(p => p.Order).Returns(-5); + + var sequence = 0; + provider1.Setup(p => p.OnProvidersExecuting(It.IsAny())) + .Callback((PageApplicationModelProviderContext c) => + { + Assert.Equal(1, sequence++); + c.PageApplicationModel = new PageApplicationModel(descriptor, typeof(object).GetTypeInfo(), new object[0]); + }) + .Verifiable(); + + provider2.Setup(p => p.OnProvidersExecuting(It.IsAny())) + .Callback((PageApplicationModelProviderContext c) => + { + Assert.Equal(0, sequence++); + }) + .Verifiable(); + + provider1.Setup(p => p.OnProvidersExecuted(It.IsAny())) + .Callback((PageApplicationModelProviderContext c) => + { + Assert.Equal(2, sequence++); + }) + .Verifiable(); + + provider2.Setup(p => p.OnProvidersExecuted(It.IsAny())) + .Callback((PageApplicationModelProviderContext c) => + { + Assert.Equal(3, sequence++); + }) + .Verifiable(); + + var providers = new[] + { + provider1.Object, provider2.Object + }; + + var loader = new DefaultPageLoader( + providers, + compilerProvider, + options); + + // Act + var result = loader.Load(new PageActionDescriptor()); + + // Assert + provider1.Verify(); + provider2.Verify(); + } + [Fact] public void Load_InvokesApplicationModelConventions() {