diff --git a/src/Microsoft.AspNet.Mvc.Razor/Compilation/ICompilerCache.cs b/src/Microsoft.AspNet.Mvc.Razor/Compilation/ICompilerCache.cs index 132908856d..d11d4a4a30 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/Compilation/ICompilerCache.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/Compilation/ICompilerCache.cs @@ -6,10 +6,10 @@ using Microsoft.AspNet.FileSystems; namespace Microsoft.AspNet.Mvc.Razor { - public interface ICompilerCache - { + public interface ICompilerCache + { CompilationResult GetOrAdd([NotNull] RelativeFileInfo fileInfo, bool enableInstrumentation, [NotNull] Func compile); - } + } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Razor/IRazorPageFactory.cs b/src/Microsoft.AspNet.Mvc.Razor/IRazorPageFactory.cs index b84b180625..daaf28222e 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/IRazorPageFactory.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/IRazorPageFactory.cs @@ -12,8 +12,7 @@ namespace Microsoft.AspNet.Mvc.Razor /// Creates a for the specified path. /// /// The path to locate the page. - /// Indicates that execution of the page should be instrumented. /// The IRazorPage instance if it exists, null otherwise. - IRazorPage CreateInstance(string relativePath, bool enableInstrumentation); + IRazorPage CreateInstance(string relativePath); } } diff --git a/src/Microsoft.AspNet.Mvc.Razor/IRazorView.cs b/src/Microsoft.AspNet.Mvc.Razor/IRazorView.cs index a5e261d9c9..7f8f411a7e 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/IRazorView.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/IRazorView.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Mvc.Rendering; -using Microsoft.AspNet.PageExecutionInstrumentation; namespace Microsoft.AspNet.Mvc.Razor { @@ -18,8 +17,6 @@ namespace Microsoft.AspNet.Mvc.Razor /// /// The instance to execute. /// Determines if the view is to be executed as a partial. - void Contextualize(IRazorPage razorPage, - bool isPartial, - IPageExecutionListenerFeature pageExecutionListenerFeature); + void Contextualize(IRazorPage razorPage, bool isPartial); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Razor/IViewStartProvider.cs b/src/Microsoft.AspNet.Mvc.Razor/IViewStartProvider.cs index 2076af472f..47a445d04b 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/IViewStartProvider.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/IViewStartProvider.cs @@ -15,8 +15,7 @@ namespace Microsoft.AspNet.Mvc.Razor /// that are applicable to the specified view. /// /// The path of the page to locate ViewStart files for. - /// Indicates that execution of the page should be instrumented. /// A sequence of that represent ViewStart. - IEnumerable GetViewStartPages(string path, bool enableInstrumentation); + IEnumerable GetViewStartPages(string path); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs index a27e9f2a18..6064bea6fd 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs @@ -44,12 +44,10 @@ namespace Microsoft.AspNet.Mvc.Razor /// public virtual void Contextualize([NotNull] IRazorPage razorPage, - bool isPartial, - IPageExecutionListenerFeature pageExecutionListener) + bool isPartial) { _razorPage = razorPage; _isPartial = isPartial; - _pageExecutionFeature = pageExecutionListener; } /// @@ -61,6 +59,8 @@ namespace Microsoft.AspNet.Mvc.Razor throw new InvalidOperationException(message); } + _pageExecutionFeature = context.HttpContext.GetFeature(); + if (!_isPartial) { var bodyWriter = await RenderPageAsync(_razorPage, context, executeViewStart: true); @@ -131,7 +131,7 @@ namespace Microsoft.AspNet.Mvc.Razor private async Task RenderViewStartAsync(ViewContext context) { - var viewStarts = _viewStartProvider.GetViewStartPages(_razorPage.Path, EnableInstrumentation); + var viewStarts = _viewStartProvider.GetViewStartPages(_razorPage.Path); foreach (var viewStart in viewStarts) { @@ -161,7 +161,7 @@ namespace Microsoft.AspNet.Mvc.Razor throw new InvalidOperationException(message); } - var layoutPage = _pageFactory.CreateInstance(previousPage.Layout, EnableInstrumentation); + var layoutPage = _pageFactory.CreateInstance(previousPage.Layout); if (layoutPage == null) { var message = Resources.FormatLayoutCannotBeLocated(previousPage.Layout); diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs index b91790bbea..a6a5f2ab10 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Globalization; using Microsoft.AspNet.Mvc.Razor.OptionDescriptors; using Microsoft.AspNet.Mvc.Rendering; @@ -37,9 +36,6 @@ namespace Microsoft.AspNet.Mvc.Razor private readonly IRazorPageFactory _pageFactory; private readonly IReadOnlyList _viewLocationExpanders; private readonly IViewLocationCache _viewLocationCache; - // The RazorViewEngine is Request scoped which allows us to cache these value for the lifetime of a Request. - private bool _isPageExecutionFeatureInitialized; - private IPageExecutionListenerFeature _pageExecutionListenerFeature; /// /// Initializes a new instance of the class. @@ -95,7 +91,7 @@ namespace Microsoft.AspNet.Mvc.Razor { if (viewName.EndsWith(ViewExtension, StringComparison.OrdinalIgnoreCase)) { - var page = _pageFactory.CreateInstance(viewName, IsInstrumentationEnabled(context)); + var page = _pageFactory.CreateInstance(viewName); if (page != null) { return CreateFoundResult(context, page, viewName, partial); @@ -137,7 +133,7 @@ namespace Microsoft.AspNet.Mvc.Razor var viewLocation = _viewLocationCache.Get(expanderContext); if (!string.IsNullOrEmpty(viewLocation)) { - var page = _pageFactory.CreateInstance(viewLocation, IsInstrumentationEnabled(context)); + var page = _pageFactory.CreateInstance(viewLocation); if (page != null) { @@ -163,9 +159,7 @@ namespace Microsoft.AspNet.Mvc.Razor viewName, controllerName, areaName); - - var isInstrumentated = IsInstrumentationEnabled(context); - var page = _pageFactory.CreateInstance(transformedPath, isInstrumentated); + var page = _pageFactory.CreateInstance(transformedPath); if (page != null) { // 3a. We found a page. Cache the set of values that produced it and return a found result. @@ -190,9 +184,8 @@ namespace Microsoft.AspNet.Mvc.Razor var services = actionContext.HttpContext.RequestServices; var view = services.GetService(); - Debug.Assert(_isPageExecutionFeatureInitialized, "IsInstrumentationEnabled must be called prior to this."); - view.Contextualize(page, partial, _pageExecutionListenerFeature); + view.Contextualize(page, partial); return ViewEngineResult.Found(viewName, view); } @@ -200,16 +193,5 @@ namespace Microsoft.AspNet.Mvc.Razor { return name[0] == '~' || name[0] == '/'; } - - private bool IsInstrumentationEnabled(ActionContext context) - { - if (!_isPageExecutionFeatureInitialized) - { - _isPageExecutionFeatureInitialized = true; - _pageExecutionListenerFeature = context.HttpContext.GetFeature(); - } - - return _pageExecutionListenerFeature != null; - } } } diff --git a/src/Microsoft.AspNet.Mvc.Razor/ViewStartProvider.cs b/src/Microsoft.AspNet.Mvc.Razor/ViewStartProvider.cs index a22e73d996..f99d1a61d7 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/ViewStartProvider.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/ViewStartProvider.cs @@ -23,10 +23,10 @@ namespace Microsoft.AspNet.Mvc.Razor } /// - public IEnumerable GetViewStartPages([NotNull] string path, bool enableInstrumentation) + public IEnumerable GetViewStartPages([NotNull] string path) { var viewStartLocations = ViewStartUtility.GetViewStartLocations(_fileSystem, path); - var viewStarts = viewStartLocations.Select(p => _pageFactory.CreateInstance(p, enableInstrumentation)) + var viewStarts = viewStartLocations.Select(_pageFactory.CreateInstance) .Where(p => p != null) .ToArray(); diff --git a/src/Microsoft.AspNet.Mvc.Razor/VirtualPathRazorPageFactory.cs b/src/Microsoft.AspNet.Mvc.Razor/VirtualPathRazorPageFactory.cs index 8c6d8732d2..3fd41f329a 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/VirtualPathRazorPageFactory.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/VirtualPathRazorPageFactory.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.PageExecutionInstrumentation; using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Mvc.Razor @@ -16,9 +18,22 @@ namespace Microsoft.AspNet.Mvc.Razor private readonly IServiceProvider _serviceProvider; private readonly IFileInfoCache _fileInfoCache; private readonly ICompilerCache _compilerCache; - + private readonly bool _isInstrumentationEnabled; private IRazorCompilationService _razorcompilationService; + public VirtualPathRazorPageFactory(ITypeActivator typeActivator, + IServiceProvider serviceProvider, + ICompilerCache compilerCache, + IFileInfoCache fileInfoCache, + IContextAccessor contextAccessor) + { + _activator = typeActivator; + _serviceProvider = serviceProvider; + _compilerCache = compilerCache; + _fileInfoCache = fileInfoCache; + _isInstrumentationEnabled = IsInstrumentationEnabled(contextAccessor.Value); + } + private IRazorCompilationService RazorCompilationService { get @@ -27,26 +42,15 @@ namespace Microsoft.AspNet.Mvc.Razor { // it is ok to use the cached service provider because this service has // a lifetime of Scoped. - _razorcompilationService = _serviceProvider.GetService(); + _razorcompilationService = _serviceProvider.GetService(); } return _razorcompilationService; } } - public VirtualPathRazorPageFactory(ITypeActivator typeActivator, - IServiceProvider serviceProvider, - ICompilerCache compilerCache, - IFileInfoCache fileInfoCache) - { - _activator = typeActivator; - _serviceProvider = serviceProvider; - _compilerCache = compilerCache; - _fileInfoCache = fileInfoCache; - } - /// - public IRazorPage CreateInstance([NotNull] string relativePath, bool enableInstrumentation) + public IRazorPage CreateInstance([NotNull] string relativePath) { if (relativePath.StartsWith("~/", StringComparison.Ordinal)) { @@ -64,8 +68,10 @@ namespace Microsoft.AspNet.Mvc.Razor RelativePath = relativePath, }; - var result = _compilerCache.GetOrAdd(relativeFileInfo, enableInstrumentation, () => - RazorCompilationService.Compile(relativeFileInfo, enableInstrumentation)); + var result = _compilerCache.GetOrAdd( + relativeFileInfo, + _isInstrumentationEnabled, + () => RazorCompilationService.Compile(relativeFileInfo, _isInstrumentationEnabled)); var page = (IRazorPage)_activator.CreateInstance(_serviceProvider, result.CompiledType); page.Path = relativePath; @@ -75,5 +81,10 @@ namespace Microsoft.AspNet.Mvc.Razor return null; } + + private static bool IsInstrumentationEnabled(HttpContext context) + { + return context.GetFeature() != null; + } } } diff --git a/src/Microsoft.AspNet.Mvc/MvcServices.cs b/src/Microsoft.AspNet.Mvc/MvcServices.cs index fdd3c2d64b..9154842654 100644 --- a/src/Microsoft.AspNet.Mvc/MvcServices.cs +++ b/src/Microsoft.AspNet.Mvc/MvcServices.cs @@ -59,7 +59,8 @@ namespace Microsoft.AspNet.Mvc // specific services. yield return describe.Transient(); yield return describe.Scoped(); - yield return describe.Singleton(); + // The ViewStartProvider needs to be able to consume scoped instances of IRazorPageFactory + yield return describe.Scoped(); yield return describe.Transient(); // Transient since the IViewLocationExpanders returned by the instance is cached by view engines. diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs index e927d08de2..9dea394ec9 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs @@ -183,7 +183,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test // Arrange var pageFactory = new Mock(); var page = Mock.Of(); - pageFactory.Setup(p => p.CreateInstance(It.IsAny(), false)) + pageFactory.Setup(p => p.CreateInstance(It.IsAny())) .Returns(Mock.Of()); var viewEngine = CreateViewEngine(pageFactory.Object); var context = GetActionContext(_controllerTestContext); @@ -203,7 +203,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test // Arrange var pageFactory = new Mock(); var page = Mock.Of(); - pageFactory.Setup(p => p.CreateInstance("fake-path1/bar/test-view.rzr", false)) + pageFactory.Setup(p => p.CreateInstance("fake-path1/bar/test-view.rzr")) .Returns(Mock.Of()) .Verifiable(); var viewEngine = new OverloadedLocationViewEngine(pageFactory.Object, @@ -224,7 +224,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test // Arrange var pageFactory = new Mock(); var page = Mock.Of(); - pageFactory.Setup(p => p.CreateInstance("fake-area-path/foo/bar/test-view2.rzr", false)) + pageFactory.Setup(p => p.CreateInstance("fake-area-path/foo/bar/test-view2.rzr")) .Returns(Mock.Of()) .Verifiable(); var viewEngine = new OverloadedLocationViewEngine(pageFactory.Object, @@ -273,7 +273,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance("test-string/bar.cshtml", false)) + pageFactory.Setup(p => p.CreateInstance("test-string/bar.cshtml")) .Returns(Mock.Of()) .Verifiable(); var expander1Result = new[] { "some-seed" }; @@ -325,9 +325,9 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance("/Views/bar/baz.cshtml", false)) + pageFactory.Setup(p => p.CreateInstance("/Views/bar/baz.cshtml")) .Verifiable(); - pageFactory.Setup(p => p.CreateInstance("/Views/Shared/baz.cshtml", false)) + pageFactory.Setup(p => p.CreateInstance("/Views/Shared/baz.cshtml")) .Returns(Mock.Of()) .Verifiable(); var cache = GetViewLocationCache(); @@ -353,7 +353,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var pageFactory = new Mock(MockBehavior.Strict); - pageFactory.Setup(p => p.CreateInstance("some-view-location", false)) + pageFactory.Setup(p => p.CreateInstance("some-view-location")) .Returns(Mock.Of()) .Verifiable(); var expander = new Mock(MockBehavior.Strict); @@ -384,10 +384,10 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance("expired-location", false)) + pageFactory.Setup(p => p.CreateInstance("expired-location")) .Returns((IRazorPage)null) .Verifiable(); - pageFactory.Setup(p => p.CreateInstance("some-view-location", false)) + pageFactory.Setup(p => p.CreateInstance("some-view-location")) .Returns(Mock.Of()) .Verifiable(); var cacheMock = new Mock(); diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewTest.cs index 009273a94c..5c4ac4bfc7 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewTest.cs @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: true, pageExecutionListener: null); + view.Contextualize(page, isPartial: true); var viewContext = CreateViewContext(view); var expected = viewContext.Writer; @@ -74,7 +74,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), activator.Object, CreateViewStartProvider()); - view.Contextualize(page, isPartial: true, pageExecutionListener: null); + view.Contextualize(page, isPartial: true); var viewContext = CreateViewContext(view); var expectedWriter = viewContext.Writer; activator.Setup(a => a.Activate(page, It.IsAny())) @@ -104,7 +104,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), activator.Object, CreateViewStartProvider()); - view.Contextualize(page, isPartial: true, pageExecutionListener: null); + view.Contextualize(page, isPartial: true); var viewContext = CreateViewContext(view); // Act @@ -126,16 +126,16 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(pageFactory.Object, Mock.Of(), viewStartProvider); - view.Contextualize(page, isPartial: true, pageExecutionListener: null); + view.Contextualize(page, isPartial: true); var viewContext = CreateViewContext(view); // Act await view.RenderAsync(viewContext); // Assert - pageFactory.Verify(v => v.CreateInstance(It.IsAny(), It.IsAny()), Times.Never()); + pageFactory.Verify(v => v.CreateInstance(It.IsAny()), Times.Never()); Mock.Get(viewStartProvider) - .Verify(v => v.GetViewStartPages(It.IsAny(), It.IsAny()), Times.Never()); + .Verify(v => v.GetViewStartPages(It.IsAny()), Times.Never()); } [Fact] @@ -150,7 +150,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); var original = viewContext.Writer; @@ -173,7 +173,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); var original = viewContext.Writer; @@ -198,7 +198,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), activator.Object, CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); @@ -240,7 +240,7 @@ namespace Microsoft.AspNet.Mvc.Razor var view = new RazorView(Mock.Of(), activator.Object, CreateViewStartProvider(viewStart1, viewStart2)); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); // Act @@ -288,13 +288,13 @@ foot-content"; activator.Setup(a => a.Activate(layout, It.IsAny())) .Verifiable(); var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance(LayoutPath, false)) + pageFactory.Setup(p => p.CreateInstance(LayoutPath)) .Returns(layout); var view = new RazorView(pageFactory.Object, activator.Object, CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); // Act @@ -321,13 +321,13 @@ foot-content"; v.RenderBodyPublic(); }); var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance(LayoutPath, false)) + pageFactory.Setup(p => p.CreateInstance(LayoutPath)) .Returns(layout); var view = new RazorView(pageFactory.Object, Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); // Act and Assert @@ -347,13 +347,13 @@ foot-content"; { }); var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance(LayoutPath, false)) + pageFactory.Setup(p => p.CreateInstance(LayoutPath)) .Returns(layout); var view = new RazorView(pageFactory.Object, Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); // Act and Assert @@ -399,15 +399,15 @@ body-content"; v.RenderBodyPublic(); }); var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout1.cshtml", false)) + pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout1.cshtml")) .Returns(layout1); - pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout2.cshtml", false)) + pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout2.cshtml")) .Returns(layout2); var view = new RazorView(pageFactory.Object, Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); // Act @@ -447,13 +447,13 @@ section-content-2"; }); var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance("layout-1", false)) + pageFactory.Setup(p => p.CreateInstance("layout-1")) .Returns(layout1); var view = new RazorView(pageFactory.Object, Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); // Act @@ -491,13 +491,13 @@ section-content-2"; }); var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance("layout-1", false)) + pageFactory.Setup(p => p.CreateInstance("layout-1")) .Returns(layout1); var view = new RazorView(pageFactory.Object, Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); // Act @@ -523,7 +523,7 @@ section-content-2"; var view = new RazorView(Mock.Of(), Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); // Act and Assert @@ -558,13 +558,13 @@ section-content-2"; v.Layout = "~/Shared/Layout2.cshtml"; }); var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout1.cshtml", false)) + pageFactory.Setup(p => p.CreateInstance("~/Shared/Layout1.cshtml")) .Returns(layout1); var view = new RazorView(pageFactory.Object, Mock.Of(), CreateViewStartProvider()); - view.Contextualize(page, isPartial: false, pageExecutionListener: null); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); // Act and Assert @@ -627,17 +627,18 @@ section-content-2"; layout.Path = "/Layout.cshtml"; var pageFactory = new Mock(); - pageFactory.Setup(p => p.CreateInstance("/Layout.cshtml", true)) + pageFactory.Setup(p => p.CreateInstance("/Layout.cshtml")) .Returns(layout); var viewStartProvider = new Mock(); - viewStartProvider.Setup(v => v.GetViewStartPages(It.IsAny(), true)) + viewStartProvider.Setup(v => v.GetViewStartPages(It.IsAny())) .Returns(Enumerable.Empty()) .Verifiable(); var view = new RazorView(pageFactory.Object, Mock.Of(), viewStartProvider.Object); - view.Contextualize(page, isPartial: false, pageExecutionListener: feature.Object); + view.Contextualize(page, isPartial: false); var viewContext = CreateViewContext(view); + viewContext.HttpContext.SetFeature(feature.Object); // Act await view.RenderAsync(viewContext); @@ -672,9 +673,10 @@ section-content-2"; var view = new RazorView(Mock.Of(), Mock.Of(), Mock.Of()); - view.Contextualize(page, isPartial: true, pageExecutionListener: feature.Object); + view.Contextualize(page, isPartial: true); var viewContext = CreateViewContext(view); viewContext.Writer = writer; + viewContext.HttpContext.SetFeature(feature.Object); // Act await view.RenderAsync(viewContext); @@ -700,7 +702,7 @@ section-content-2"; var view = new RazorView(Mock.Of(), Mock.Of(), Mock.Of()); - view.Contextualize(page, isPartial, pageExecutionListener: null); + view.Contextualize(page, isPartial); var viewContext = CreateViewContext(view); // Act @@ -734,7 +736,7 @@ section-content-2"; { viewStartPages = viewStartPages ?? new IRazorPage[0]; var viewStartProvider = new Mock(); - viewStartProvider.Setup(v => v.GetViewStartPages(It.IsAny(), false)) + viewStartProvider.Setup(v => v.GetViewStartPages(It.IsAny())) .Returns(viewStartPages); return viewStartProvider.Object;