Modify FindView and FindPartialView to accept ActionContext

Fixes #787
This commit is contained in:
Pranav K 2014-07-14 19:13:09 -07:00
parent a2561281b7
commit 47d227cbf2
17 changed files with 159 additions and 108 deletions

View File

@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Mvc
var viewEngine = ViewEngine ?? context.HttpContext.RequestServices.GetService<ICompositeViewEngine>(); var viewEngine = ViewEngine ?? context.HttpContext.RequestServices.GetService<ICompositeViewEngine>();
var viewName = ViewName ?? context.ActionDescriptor.Name; var viewName = ViewName ?? context.ActionDescriptor.Name;
var view = FindView(viewEngine, context.RouteData.Values, viewName); var view = FindView(viewEngine, context, viewName);
using (view as IDisposable) using (view as IDisposable)
{ {
@ -52,10 +52,7 @@ namespace Microsoft.AspNet.Mvc
} }
} }
private static IView FindView( private static IView FindView(IViewEngine viewEngine, ActionContext context, string viewName)
[NotNull] IViewEngine viewEngine,
[NotNull] IDictionary<string, object> context,
[NotNull] string viewName)
{ {
var result = viewEngine.FindView(context, viewName); var result = viewEngine.FindView(context, viewName);
if (!result.Success) if (!result.Success)

View File

@ -1,7 +1,6 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. 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 System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -21,20 +20,20 @@ namespace Microsoft.AspNet.Mvc.Rendering
public IReadOnlyList<IViewEngine> ViewEngines { get; private set; } public IReadOnlyList<IViewEngine> ViewEngines { get; private set; }
/// <inheritdoc /> /// <inheritdoc />
public ViewEngineResult FindPartialView([NotNull] IDictionary<string, object> context, public ViewEngineResult FindPartialView([NotNull] ActionContext context,
[NotNull] string partialViewName) [NotNull] string partialViewName)
{ {
return FindView(context, partialViewName, partial: true); return FindView(context, partialViewName, partial: true);
} }
/// <inheritdoc /> /// <inheritdoc />
public ViewEngineResult FindView([NotNull] IDictionary<string, object> context, public ViewEngineResult FindView([NotNull] ActionContext context,
[NotNull] string viewName) [NotNull] string viewName)
{ {
return FindView(context, viewName, partial: false); return FindView(context, viewName, partial: false);
} }
private ViewEngineResult FindView(IDictionary<string, object> context, private ViewEngineResult FindView(ActionContext context,
string viewName, string viewName,
bool partial) bool partial)
{ {
@ -48,6 +47,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{ {
return result; return result;
} }
searchedLocations = searchedLocations.Concat(result.SearchedLocations); searchedLocations = searchedLocations.Concat(result.SearchedLocations);
} }

View File

@ -381,7 +381,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var newViewData = new ViewDataDictionary(baseViewData, model); var newViewData = new ViewDataDictionary(baseViewData, model);
var viewEngineResult = _viewEngine.FindPartialView(ViewContext.RouteData.Values, partialViewName); var viewEngineResult = _viewEngine.FindPartialView(ViewContext, partialViewName);
if (!viewEngineResult.Success) if (!viewEngineResult.Success)
{ {
var locations = string.Empty; var locations = string.Empty;

View File

@ -88,8 +88,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{ {
var fullViewName = modeViewPath + "/" + viewName; var fullViewName = modeViewPath + "/" + viewName;
// Forcing synchronous behavior so users don't have to await templates. var viewEngineResult = _viewEngine.FindPartialView(_viewContext, fullViewName);
var viewEngineResult = _viewEngine.FindPartialView(_viewContext.RouteData.Values, fullViewName);
if (viewEngineResult.Success) if (viewEngineResult.Success)
{ {
using (var writer = new StringWriter(CultureInfo.InvariantCulture)) using (var writer = new StringWriter(CultureInfo.InvariantCulture))

View File

@ -1,16 +1,27 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Copyright (c) Microsoft Open Technologies, Inc. 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.Collections.Generic;
namespace Microsoft.AspNet.Mvc.Rendering namespace Microsoft.AspNet.Mvc.Rendering
{ {
/// <summary>
/// Defines the contract for a view engine.
/// </summary>
public interface IViewEngine public interface IViewEngine
{ {
ViewEngineResult FindView([NotNull] IDictionary<string, object> context, [NotNull] string viewName); /// <summary>
/// Finds the specified view by using the specified action context.
/// </summary>
/// <param name="context">The action context.</param>
/// <param name="viewName">The name or full path to the view.</param>
/// <returns>A result representing the result of locating the view.</returns>
ViewEngineResult FindView(ActionContext context, string viewName);
ViewEngineResult FindPartialView( /// <summary>
[NotNull] IDictionary<string, object> context, /// Finds the specified partial view by using the specified action context.
[NotNull] string partialViewName); /// </summary>
/// <param name="context">The action context.</param>
/// <param name="viewName">The name or full path to the view.</param>
/// <returns>A result representing the result of locating the view.</returns>
ViewEngineResult FindPartialView(ActionContext context, string partialViewName);
} }
} }

View File

@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Mvc
ViewName ?? "Default"); ViewName ?? "Default");
} }
var view = FindView(context.ViewContext.RouteData.Values, qualifiedViewName); var view = FindView(context.ViewContext, qualifiedViewName);
var childViewContext = new ViewContext( var childViewContext = new ViewContext(
context.ViewContext, context.ViewContext,
@ -75,7 +75,7 @@ namespace Microsoft.AspNet.Mvc
} }
} }
private IView FindView([NotNull] IDictionary<string, object> context, [NotNull] string viewName) private IView FindView(ActionContext context, string viewName)
{ {
var result = _viewEngine.FindView(context, viewName); var result = _viewEngine.FindView(context, viewName);
if (!result.Success) if (!result.Success)

View File

@ -9,6 +9,9 @@ using Microsoft.AspNet.Mvc.Rendering;
namespace Microsoft.AspNet.Mvc.Razor namespace Microsoft.AspNet.Mvc.Razor
{ {
/// <summary>
/// Represents a view engine that is used to render a page that uses the Razor syntax.
/// </summary>
public class RazorViewEngine : IViewEngine public class RazorViewEngine : IViewEngine
{ {
private const string ViewExtension = ".cshtml"; private const string ViewExtension = ".cshtml";
@ -27,15 +30,22 @@ namespace Microsoft.AspNet.Mvc.Razor
}; };
private readonly IRazorPageFactory _pageFactory; private readonly IRazorPageFactory _pageFactory;
private readonly IRazorPageActivator _viewActivator; private readonly IRazorPageActivator _pageActivator;
private readonly IViewStartProvider _viewStartProvider; private readonly IViewStartProvider _viewStartProvider;
/// <summary>
/// Initializes a new instance of the RazorViewEngine class.
/// </summary>
/// <param name="pageFactory">The page factory used for creating <see cref="IRazorPage"/>.</param>
/// <param name="pageActivator">Activator for activated instances of <see cref="IRazorPage"/>.</param>
/// <param name="viewStartProvider">The provider used to provide instances of ViewStarts applicable to the
/// page being rendered.</param>
public RazorViewEngine(IRazorPageFactory pageFactory, public RazorViewEngine(IRazorPageFactory pageFactory,
IRazorPageActivator viewActivator, IRazorPageActivator pageActivator,
IViewStartProvider viewStartProvider) IViewStartProvider viewStartProvider)
{ {
_pageFactory = pageFactory; _pageFactory = pageFactory;
_viewActivator = viewActivator; _pageActivator = pageActivator;
_viewStartProvider = viewStartProvider; _viewStartProvider = viewStartProvider;
} }
@ -44,21 +54,23 @@ namespace Microsoft.AspNet.Mvc.Razor
get { return _viewLocationFormats; } get { return _viewLocationFormats; }
} }
public ViewEngineResult FindView([NotNull] IDictionary<string, object> context, /// <inheritdoc />
public ViewEngineResult FindView([NotNull] ActionContext context,
[NotNull] string viewName) [NotNull] string viewName)
{ {
var viewEngineResult = CreateViewEngineResult(context, viewName, partial: false); var viewEngineResult = CreateViewEngineResult(context, viewName, partial: false);
return viewEngineResult; return viewEngineResult;
} }
public ViewEngineResult FindPartialView([NotNull] IDictionary<string, object> context, /// <inheritdoc />
public ViewEngineResult FindPartialView([NotNull] ActionContext context,
[NotNull] string partialViewName) [NotNull] string partialViewName)
{ {
return CreateViewEngineResult(context, partialViewName, partial: true); return CreateViewEngineResult(context, partialViewName, partial: true);
} }
private ViewEngineResult CreateViewEngineResult([NotNull] IDictionary<string, object> context, private ViewEngineResult CreateViewEngineResult(ActionContext context,
[NotNull] string viewName, string viewName,
bool partial) bool partial)
{ {
var nameRepresentsPath = IsSpecificPath(viewName); var nameRepresentsPath = IsSpecificPath(viewName);
@ -78,8 +90,9 @@ namespace Microsoft.AspNet.Mvc.Razor
} }
else else
{ {
var controllerName = context.GetValueOrDefault<string>("controller"); var routeValues = context.RouteData.Values;
var areaName = context.GetValueOrDefault<string>("area"); var controllerName = routeValues.GetValueOrDefault<string>("controller");
var areaName = routeValues.GetValueOrDefault<string>("area");
var potentialPaths = GetViewSearchPaths(viewName, controllerName, areaName); var potentialPaths = GetViewSearchPaths(viewName, controllerName, areaName);
foreach (var path in potentialPaths) foreach (var path in potentialPaths)
@ -98,9 +111,9 @@ namespace Microsoft.AspNet.Mvc.Razor
private ViewEngineResult CreateFoundResult(IRazorPage page, string viewName, bool partial) private ViewEngineResult CreateFoundResult(IRazorPage page, string viewName, bool partial)
{ {
var view = new RazorView(_pageFactory, var view = new RazorView(_pageFactory,
_viewActivator, _pageActivator,
_viewStartProvider, _viewStartProvider,
page, page,
executeViewHierarchy: !partial); executeViewHierarchy: !partial);
return ViewEngineResult.Found(viewName, view); return ViewEngineResult.Found(viewName, view);
} }

View File

@ -64,12 +64,12 @@ namespace Microsoft.AspNet.Mvc.Rendering
private class TestViewEngine : IViewEngine private class TestViewEngine : IViewEngine
{ {
public ViewEngineResult FindPartialView([NotNull]IDictionary<string, object> context, [NotNull]string partialViewName) public ViewEngineResult FindPartialView(ActionContext context, string partialViewName)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public ViewEngineResult FindView([NotNull]IDictionary<string, object> context, [NotNull]string viewName) public ViewEngineResult FindView(ActionContext context, string viewName)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -3,6 +3,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Routing;
using Moq; using Moq;
using Xunit; using Xunit;
@ -18,16 +20,18 @@ namespace Microsoft.AspNet.Mvc.Rendering
var provider = new Mock<IViewEngineProvider>(); var provider = new Mock<IViewEngineProvider>();
provider.SetupGet(p => p.ViewEngines) provider.SetupGet(p => p.ViewEngines)
.Returns(new IViewEngine[0]); .Returns(new IViewEngine[0]);
var actionContext = GetActionContext();
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindView(actionContext, viewName);
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
Assert.Empty(result.SearchedLocations); Assert.Empty(result.SearchedLocations);
} }
[Fact] [Fact]
public void FindView_ReturnsNotFoundResult_WhenExactlyOneViewEngineIsRegisteredWhichReturnsNotFoundResult() public void FindView_ReturnsNotFoundResult_WhenExactlyOneViewEngineIsRegisteredWhichReturnsNotFoundResult()
{ {
@ -35,14 +39,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
var viewName = "test-view"; var viewName = "test-view";
var provider = new Mock<IViewEngineProvider>(); var provider = new Mock<IViewEngineProvider>();
var engine = new Mock<IViewEngine>(); var engine = new Mock<IViewEngine>();
engine.Setup(e => e.FindView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine.Setup(e => e.FindView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, new[] { "controller/test-view" })); .Returns(ViewEngineResult.NotFound(viewName, new[] { "controller/test-view" }));
provider.SetupGet(p => p.ViewEngines) provider.SetupGet(p => p.ViewEngines)
.Returns(new[] { engine.Object }); .Returns(new[] { engine.Object });
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindView(GetActionContext(), viewName);
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
@ -57,14 +61,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
var provider = new Mock<IViewEngineProvider>(); var provider = new Mock<IViewEngineProvider>();
var engine = new Mock<IViewEngine>(); var engine = new Mock<IViewEngine>();
var view = Mock.Of<IView>(); var view = Mock.Of<IView>();
engine.Setup(e => e.FindView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine.Setup(e => e.FindView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.Found(viewName, view)); .Returns(ViewEngineResult.Found(viewName, view));
provider.SetupGet(p => p.ViewEngines) provider.SetupGet(p => p.ViewEngines)
.Returns(new[] { engine.Object }); .Returns(new[] { engine.Object });
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindView(GetActionContext(), viewName);
// Assert // Assert
Assert.True(result.Success); Assert.True(result.Success);
@ -81,11 +85,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
var engine3 = new Mock<IViewEngine>(); var engine3 = new Mock<IViewEngine>();
var view2 = Mock.Of<IView>(); var view2 = Mock.Of<IView>();
var view3 = Mock.Of<IView>(); var view3 = Mock.Of<IView>();
engine1.Setup(e => e.FindView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine1.Setup(e => e.FindView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound(viewName, Enumerable.Empty<string>()));
engine2.Setup(e => e.FindView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine2.Setup(e => e.FindView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.Found(viewName, view2)); .Returns(ViewEngineResult.Found(viewName, view2));
engine3.Setup(e => e.FindView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine3.Setup(e => e.FindView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.Found(viewName, view3)); .Returns(ViewEngineResult.Found(viewName, view3));
var provider = new Mock<IViewEngineProvider>(); var provider = new Mock<IViewEngineProvider>();
@ -94,7 +98,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindView(GetActionContext(), viewName);
// Assert // Assert
Assert.True(result.Success); Assert.True(result.Success);
@ -110,11 +114,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
var engine1 = new Mock<IViewEngine>(); var engine1 = new Mock<IViewEngine>();
var engine2 = new Mock<IViewEngine>(); var engine2 = new Mock<IViewEngine>();
var engine3 = new Mock<IViewEngine>(); var engine3 = new Mock<IViewEngine>();
engine1.Setup(e => e.FindView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine1.Setup(e => e.FindView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, new[] { "1", "2" })); .Returns(ViewEngineResult.NotFound(viewName, new[] { "1", "2" }));
engine2.Setup(e => e.FindView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine2.Setup(e => e.FindView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, new[] { "3" })); .Returns(ViewEngineResult.NotFound(viewName, new[] { "3" }));
engine3.Setup(e => e.FindView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine3.Setup(e => e.FindView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, new[] { "4", "5" })); .Returns(ViewEngineResult.NotFound(viewName, new[] { "4", "5" }));
var provider = new Mock<IViewEngineProvider>(); var provider = new Mock<IViewEngineProvider>();
@ -123,7 +127,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindView(GetActionContext(), viewName);
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
@ -141,7 +145,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
@ -155,14 +159,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
var viewName = "partial-view"; var viewName = "partial-view";
var provider = new Mock<IViewEngineProvider>(); var provider = new Mock<IViewEngineProvider>();
var engine = new Mock<IViewEngine>(); var engine = new Mock<IViewEngine>();
engine.Setup(e => e.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine.Setup(e => e.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, new[] { "shared/partial-view" })); .Returns(ViewEngineResult.NotFound(viewName, new[] { "shared/partial-view" }));
provider.SetupGet(p => p.ViewEngines) provider.SetupGet(p => p.ViewEngines)
.Returns(new[] { engine.Object }); .Returns(new[] { engine.Object });
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
@ -177,14 +181,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
var provider = new Mock<IViewEngineProvider>(); var provider = new Mock<IViewEngineProvider>();
var engine = new Mock<IViewEngine>(); var engine = new Mock<IViewEngine>();
var view = Mock.Of<IView>(); var view = Mock.Of<IView>();
engine.Setup(e => e.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine.Setup(e => e.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.Found(viewName, view)); .Returns(ViewEngineResult.Found(viewName, view));
provider.SetupGet(p => p.ViewEngines) provider.SetupGet(p => p.ViewEngines)
.Returns(new[] { engine.Object }); .Returns(new[] { engine.Object });
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert // Assert
Assert.True(result.Success); Assert.True(result.Success);
@ -201,11 +205,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
var engine3 = new Mock<IViewEngine>(); var engine3 = new Mock<IViewEngine>();
var view2 = Mock.Of<IView>(); var view2 = Mock.Of<IView>();
var view3 = Mock.Of<IView>(); var view3 = Mock.Of<IView>();
engine1.Setup(e => e.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine1.Setup(e => e.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound(viewName, Enumerable.Empty<string>()));
engine2.Setup(e => e.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine2.Setup(e => e.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.Found(viewName, view2)); .Returns(ViewEngineResult.Found(viewName, view2));
engine3.Setup(e => e.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine3.Setup(e => e.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.Found(viewName, view3)); .Returns(ViewEngineResult.Found(viewName, view3));
var provider = new Mock<IViewEngineProvider>(); var provider = new Mock<IViewEngineProvider>();
@ -214,7 +218,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert // Assert
Assert.True(result.Success); Assert.True(result.Success);
@ -230,11 +234,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
var engine1 = new Mock<IViewEngine>(); var engine1 = new Mock<IViewEngine>();
var engine2 = new Mock<IViewEngine>(); var engine2 = new Mock<IViewEngine>();
var engine3 = new Mock<IViewEngine>(); var engine3 = new Mock<IViewEngine>();
engine1.Setup(e => e.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine1.Setup(e => e.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, new[] { "1", "2" })); .Returns(ViewEngineResult.NotFound(viewName, new[] { "1", "2" }));
engine2.Setup(e => e.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine2.Setup(e => e.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, new[] { "3" })); .Returns(ViewEngineResult.NotFound(viewName, new[] { "3" }));
engine3.Setup(e => e.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) engine3.Setup(e => e.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound(viewName, new[] { "4", "5" })); .Returns(ViewEngineResult.NotFound(viewName, new[] { "4", "5" }));
var provider = new Mock<IViewEngineProvider>(); var provider = new Mock<IViewEngineProvider>();
@ -243,11 +247,17 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object); var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act // Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName); var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
Assert.Equal(new[] { "1", "2", "3", "4", "5" }, result.SearchedLocations); Assert.Equal(new[] { "1", "2", "3", "4", "5" }, result.SearchedLocations);
} }
private static ActionContext GetActionContext()
{
var httpContext = Mock.Of<HttpContext>();
return new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
}
} }
} }

View File

@ -86,7 +86,7 @@ namespace Microsoft.AspNet.Mvc.Core
"; ";
var model = new DefaultTemplatesUtilities.ObjectWithScaffoldColumn(); var model = new DefaultTemplatesUtilities.ObjectWithScaffoldColumn();
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) viewEngine.Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
@ -104,7 +104,7 @@ namespace Microsoft.AspNet.Mvc.Core
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine viewEngine
.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) .Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string"; helper.ViewData["Property1"] = "ViewData string";
@ -123,7 +123,7 @@ namespace Microsoft.AspNet.Mvc.Core
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine viewEngine
.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) .Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string"; helper.ViewData["Property1"] = "ViewData string";
@ -142,7 +142,7 @@ namespace Microsoft.AspNet.Mvc.Core
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine viewEngine
.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) .Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
@ -162,7 +162,7 @@ namespace Microsoft.AspNet.Mvc.Core
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = propertyValue, }; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = propertyValue, };
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine viewEngine
.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) .Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string"; helper.ViewData["Property1"] = "ViewData string";

View File

@ -94,7 +94,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectWithScaffoldColumn(); var model = new DefaultTemplatesUtilities.ObjectWithScaffoldColumn();
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) viewEngine.Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
@ -112,7 +112,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine viewEngine
.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) .Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string"; helper.ViewData["Property1"] = "ViewData string";
@ -133,7 +133,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine viewEngine
.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) .Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string"; helper.ViewData["Property1"] = "ViewData string";
@ -154,7 +154,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine viewEngine
.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) .Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
@ -176,7 +176,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = propertyValue, }; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = propertyValue, };
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine viewEngine
.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>())) .Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>())); .Returns(ViewEngineResult.NotFound("", Enumerable.Empty<string>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string"; helper.ViewData["Property1"] = "ViewData string";

View File

@ -151,7 +151,7 @@ namespace Microsoft.AspNet.Mvc.Core
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine viewEngine
.Setup(v => v.FindPartialView(It.IsAny<Dictionary<string, object>>(), It.IsAny<string>())) .Setup(v => v.FindPartialView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.Found("MyView", view.Object)); .Returns(ViewEngineResult.Found("MyView", view.Object));
return viewEngine.Object; return viewEngine.Object;

View File

@ -51,12 +51,12 @@ namespace Microsoft.AspNet.Mvc.Rendering
public ITestService Service { get; private set; } public ITestService Service { get; private set; }
public ViewEngineResult FindPartialView([NotNull]IDictionary<string, object> context, [NotNull]string partialViewName) public ViewEngineResult FindPartialView(ActionContext context, string partialViewName)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public ViewEngineResult FindView([NotNull]IDictionary<string, object> context, [NotNull]string viewName) public ViewEngineResult FindView(ActionContext context, string viewName)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -53,12 +53,12 @@ namespace Microsoft.AspNet.Mvc.Rendering
private class TestViewEngine : IViewEngine private class TestViewEngine : IViewEngine
{ {
public ViewEngineResult FindPartialView(IDictionary<string, object> context, string partialViewName) public ViewEngineResult FindPartialView(ActionContext context, string partialViewName)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public ViewEngineResult FindView(IDictionary<string, object> context, string viewName) public ViewEngineResult FindView(ActionContext context, string viewName)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -35,8 +35,6 @@ namespace Microsoft.AspNet.Mvc.Core.Test
var routeDictionary = new Dictionary<string, object>(); var routeDictionary = new Dictionary<string, object>();
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine.Setup(v => v.FindView(routeDictionary, It.IsAny<string>()))
.Returns(ViewEngineResult.Found("MyView", view.Object));
var serviceProvider = new Mock<IServiceProvider>(); var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(sp => sp.GetService(typeof(ICompositeViewEngine))) serviceProvider.Setup(sp => sp.GetService(typeof(ICompositeViewEngine)))
@ -52,12 +50,15 @@ namespace Microsoft.AspNet.Mvc.Core.Test
.Returns(response.Object); .Returns(response.Object);
context.SetupGet(c => c.RequestServices) context.SetupGet(c => c.RequestServices)
.Returns(serviceProvider.Object); .Returns(serviceProvider.Object);
var actionContext = new ActionContext(context.Object, var actionContext = new ActionContext(context.Object,
new RouteData() { Values = routeDictionary }, new RouteData() { Values = routeDictionary },
new ActionDescriptor()); new ActionDescriptor());
viewEngine.Setup(v => v.FindView(actionContext, It.IsAny<string>()))
.Returns(ViewEngineResult.Found("MyView", view.Object));
var viewResult = new ViewResult(); var viewResult = new ViewResult();
// Act // Act
@ -84,8 +85,6 @@ namespace Microsoft.AspNet.Mvc.Core.Test
var routeDictionary = new Dictionary<string, object>(); var routeDictionary = new Dictionary<string, object>();
var goodViewEngine = new Mock<IViewEngine>(); var goodViewEngine = new Mock<IViewEngine>();
goodViewEngine.Setup(v => v.FindView(routeDictionary, It.IsAny<string>()))
.Returns(ViewEngineResult.Found("MyView", view.Object));
var badViewEngine = new Mock<ICompositeViewEngine>(MockBehavior.Strict); var badViewEngine = new Mock<ICompositeViewEngine>(MockBehavior.Strict);
@ -108,6 +107,10 @@ namespace Microsoft.AspNet.Mvc.Core.Test
new RouteData() { Values = routeDictionary }, new RouteData() { Values = routeDictionary },
new ActionDescriptor()); new ActionDescriptor());
goodViewEngine.Setup(v => v.FindView(actionContext, It.IsAny<string>()))
.Returns(ViewEngineResult.Found("MyView", view.Object));
var viewResult = new ViewResult() var viewResult = new ViewResult()
{ {
ViewEngine = goodViewEngine.Object, ViewEngine = goodViewEngine.Object,
@ -141,7 +144,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
}); });
var viewEngine = new Mock<ICompositeViewEngine>(); var viewEngine = new Mock<ICompositeViewEngine>();
viewEngine.Setup(v => v.FindView(routeDictionary, It.IsAny<string>())) viewEngine.Setup(v => v.FindView(It.IsAny<ActionContext>(), It.IsAny<string>()))
.Returns(ViewEngineResult.Found("MyView", view.Object)); .Returns(ViewEngineResult.Found("MyView", view.Object));
var serviceProvider = new Mock<IServiceProvider>(); var serviceProvider = new Mock<IServiceProvider>();
@ -156,11 +159,11 @@ namespace Microsoft.AspNet.Mvc.Core.Test
context.SetupGet(c => c.Response) context.SetupGet(c => c.Response)
.Returns(response.Object); .Returns(response.Object);
context.SetupGet(c => c.RequestServices).Returns(serviceProvider.Object); context.SetupGet(c => c.RequestServices).Returns(serviceProvider.Object);
var actionContext = new ActionContext(context.Object, var actionContext = new ActionContext(context.Object,
new RouteData() { Values = routeDictionary }, new RouteData() { Values = routeDictionary },
new ActionDescriptor()); new ActionDescriptor());
var viewResult = new ViewResult(); var viewResult = new ViewResult();
// Act // Act

View File

@ -3,7 +3,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Routing;
using Moq; using Moq;
using Xunit; using Xunit;
@ -39,10 +41,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
{ {
// Arrange // Arrange
var viewEngine = CreateSearchLocationViewEngineTester(); var viewEngine = CreateSearchLocationViewEngineTester();
var context = GetActionContext(_controllerTestContext);
// Act & Assert // Act & Assert
Assert.Throws<InvalidOperationException>(() => Assert.Throws<InvalidOperationException>(() =>
viewEngine.FindView(_controllerTestContext, viewName)); viewEngine.FindView(context, viewName));
} }
[Theory] [Theory]
@ -53,10 +56,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
var viewEngine = CreateSearchLocationViewEngineTester(); var viewEngine = CreateSearchLocationViewEngineTester();
// Append .cshtml so the viewname is no longer invalid // Append .cshtml so the viewname is no longer invalid
viewName += ".cshtml"; viewName += ".cshtml";
var context = GetActionContext(_controllerTestContext);
// Act & Assert // Act & Assert
// If this throws then our test case fails // If this throws then our test case fails
var result = viewEngine.FindPartialView(_controllerTestContext, viewName); var result = viewEngine.FindPartialView(context, viewName);
Assert.False(result.Success); Assert.False(result.Success);
} }
@ -67,10 +71,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
{ {
// Arrange // Arrange
var viewEngine = CreateSearchLocationViewEngineTester(); var viewEngine = CreateSearchLocationViewEngineTester();
var context = GetActionContext(_controllerTestContext);
// Act & Assert // Act & Assert
Assert.Throws<InvalidOperationException>(() => Assert.Throws<InvalidOperationException>(() =>
viewEngine.FindPartialView(_controllerTestContext, partialViewName)); viewEngine.FindPartialView(context, partialViewName));
} }
[Theory] [Theory]
@ -81,10 +86,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
var viewEngine = CreateSearchLocationViewEngineTester(); var viewEngine = CreateSearchLocationViewEngineTester();
// Append .cshtml so the viewname is no longer invalid // Append .cshtml so the viewname is no longer invalid
partialViewName += ".cshtml"; partialViewName += ".cshtml";
var context = GetActionContext(_controllerTestContext);
// Act & Assert // Act & Assert
// If this throws then our test case fails // If this throws then our test case fails
var result = viewEngine.FindPartialView(_controllerTestContext, partialViewName); var result = viewEngine.FindPartialView(context, partialViewName);
Assert.False(result.Success); Assert.False(result.Success);
} }
@ -95,15 +101,16 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
// Arrange // Arrange
var searchedLocations = new List<string>(); var searchedLocations = new List<string>();
var viewEngine = CreateSearchLocationViewEngineTester(); var viewEngine = CreateSearchLocationViewEngineTester();
var context = GetActionContext(_areaTestContext);
// Act // Act
var result = viewEngine.FindPartialView(_areaTestContext, "partial"); var result = viewEngine.FindPartialView(context, "partial");
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
Assert.Equal(new[] { Assert.Equal(new[] {
"/Areas/foo/Views/bar/partial.cshtml", "/Areas/foo/Views/bar/partial.cshtml",
"/Areas/foo/Views/Shared/partial.cshtml", "/Areas/foo/Views/Shared/partial.cshtml",
"/Views/Shared/partial.cshtml", "/Views/Shared/partial.cshtml",
}, result.SearchedLocations); }, result.SearchedLocations);
} }
@ -113,14 +120,15 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
{ {
// Arrange // Arrange
var viewEngine = CreateSearchLocationViewEngineTester(); var viewEngine = CreateSearchLocationViewEngineTester();
var context = GetActionContext(_controllerTestContext);
// Act // Act
var result = viewEngine.FindPartialView(_controllerTestContext, "partialNoArea"); var result = viewEngine.FindPartialView(context, "partialNoArea");
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
Assert.Equal(new[] { Assert.Equal(new[] {
"/Views/bar/partialNoArea.cshtml", "/Views/bar/partialNoArea.cshtml",
"/Views/Shared/partialNoArea.cshtml", "/Views/Shared/partialNoArea.cshtml",
}, result.SearchedLocations); }, result.SearchedLocations);
} }
@ -130,15 +138,16 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
{ {
// Arrange // Arrange
var viewEngine = CreateSearchLocationViewEngineTester(); var viewEngine = CreateSearchLocationViewEngineTester();
var context = GetActionContext(_areaTestContext);
// Act // Act
var result = viewEngine.FindView(_areaTestContext, "full"); var result = viewEngine.FindView(context, "full");
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
Assert.Equal(new[] { Assert.Equal(new[] {
"/Areas/foo/Views/bar/full.cshtml", "/Areas/foo/Views/bar/full.cshtml",
"/Areas/foo/Views/Shared/full.cshtml", "/Areas/foo/Views/Shared/full.cshtml",
"/Views/Shared/full.cshtml", "/Views/Shared/full.cshtml",
}, result.SearchedLocations); }, result.SearchedLocations);
} }
@ -148,14 +157,15 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
{ {
// Arrange // Arrange
var viewEngine = CreateSearchLocationViewEngineTester(); var viewEngine = CreateSearchLocationViewEngineTester();
var context = GetActionContext(_controllerTestContext);
// Act // Act
var result = viewEngine.FindView(_controllerTestContext, "fullNoArea"); var result = viewEngine.FindView(context, "fullNoArea");
// Assert // Assert
Assert.False(result.Success); Assert.False(result.Success);
Assert.Equal(new[] { Assert.Equal(new[] {
"/Views/bar/fullNoArea.cshtml", "/Views/bar/fullNoArea.cshtml",
"/Views/Shared/fullNoArea.cshtml", "/Views/Shared/fullNoArea.cshtml",
}, result.SearchedLocations); }, result.SearchedLocations);
} }
@ -170,9 +180,10 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
var viewEngine = new RazorViewEngine(pageFactory.Object, var viewEngine = new RazorViewEngine(pageFactory.Object,
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
Mock.Of<IViewStartProvider>()); Mock.Of<IViewStartProvider>());
var context = GetActionContext(_controllerTestContext);
// Act // Act
var result = viewEngine.FindView(_controllerTestContext, "test-view"); var result = viewEngine.FindView(context, "test-view");
// Assert // Assert
Assert.True(result.Success); Assert.True(result.Success);
@ -192,5 +203,12 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
return viewEngine; return viewEngine;
} }
private static ActionContext GetActionContext(IDictionary<string, object> routeValues)
{
var httpContext = Mock.Of<HttpContext>();
var routeData = new RouteData { Values = routeValues };
return new ActionContext(httpContext, routeData, new ActionDescriptor());
}
} }
} }

View File

@ -2,14 +2,14 @@
// 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 System.Collections.Generic; using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.Rendering;
namespace CompositeViewEngine namespace CompositeViewEngine
{ {
public class TestViewEngine : IViewEngine public class TestViewEngine : IViewEngine
{ {
public ViewEngineResult FindPartialView(IDictionary<string, object> context, string partialViewName) public ViewEngineResult FindPartialView(ActionContext context, string partialViewName)
{ {
if (string.Equals(partialViewName, "partial-test-view", StringComparison.Ordinal)) if (string.Equals(partialViewName, "partial-test-view", StringComparison.Ordinal))
{ {
@ -18,7 +18,7 @@ namespace CompositeViewEngine
return ViewEngineResult.NotFound(partialViewName, new[] { partialViewName }); return ViewEngineResult.NotFound(partialViewName, new[] { partialViewName });
} }
public ViewEngineResult FindView(IDictionary<string, object> context, string viewName) public ViewEngineResult FindView(ActionContext context, string viewName)
{ {
if (string.Equals(viewName, "test-view")) if (string.Equals(viewName, "test-view"))
{ {