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