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

View File

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

View File

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

View File

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

View File

@ -1,16 +1,27 @@
// 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.
using System.Collections.Generic;
namespace Microsoft.AspNet.Mvc.Rendering
{
/// <summary>
/// Defines the contract for a view engine.
/// </summary>
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(
[NotNull] IDictionary<string, object> context,
[NotNull] string partialViewName);
/// <summary>
/// Finds the specified partial 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 FindPartialView(ActionContext context, string partialViewName);
}
}

View File

@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Mvc
ViewName ?? "Default");
}
var view = FindView(context.ViewContext.RouteData.Values, qualifiedViewName);
var view = FindView(context.ViewContext, qualifiedViewName);
var childViewContext = new 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);
if (!result.Success)

View File

@ -9,6 +9,9 @@ using Microsoft.AspNet.Mvc.Rendering;
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
{
private const string ViewExtension = ".cshtml";
@ -27,15 +30,22 @@ namespace Microsoft.AspNet.Mvc.Razor
};
private readonly IRazorPageFactory _pageFactory;
private readonly IRazorPageActivator _viewActivator;
private readonly IRazorPageActivator _pageActivator;
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,
IRazorPageActivator viewActivator,
IRazorPageActivator pageActivator,
IViewStartProvider viewStartProvider)
{
_pageFactory = pageFactory;
_viewActivator = viewActivator;
_pageActivator = pageActivator;
_viewStartProvider = viewStartProvider;
}
@ -44,21 +54,23 @@ namespace Microsoft.AspNet.Mvc.Razor
get { return _viewLocationFormats; }
}
public ViewEngineResult FindView([NotNull] IDictionary<string, object> context,
/// <inheritdoc />
public ViewEngineResult FindView([NotNull] ActionContext context,
[NotNull] string viewName)
{
var viewEngineResult = CreateViewEngineResult(context, viewName, partial: false);
return viewEngineResult;
}
public ViewEngineResult FindPartialView([NotNull] IDictionary<string, object> context,
/// <inheritdoc />
public ViewEngineResult FindPartialView([NotNull] ActionContext context,
[NotNull] string partialViewName)
{
return CreateViewEngineResult(context, partialViewName, partial: true);
}
private ViewEngineResult CreateViewEngineResult([NotNull] IDictionary<string, object> context,
[NotNull] string viewName,
private ViewEngineResult CreateViewEngineResult(ActionContext context,
string viewName,
bool partial)
{
var nameRepresentsPath = IsSpecificPath(viewName);
@ -78,8 +90,9 @@ namespace Microsoft.AspNet.Mvc.Razor
}
else
{
var controllerName = context.GetValueOrDefault<string>("controller");
var areaName = context.GetValueOrDefault<string>("area");
var routeValues = context.RouteData.Values;
var controllerName = routeValues.GetValueOrDefault<string>("controller");
var areaName = routeValues.GetValueOrDefault<string>("area");
var potentialPaths = GetViewSearchPaths(viewName, controllerName, areaName);
foreach (var path in potentialPaths)
@ -98,9 +111,9 @@ namespace Microsoft.AspNet.Mvc.Razor
private ViewEngineResult CreateFoundResult(IRazorPage page, string viewName, bool partial)
{
var view = new RazorView(_pageFactory,
_viewActivator,
_pageActivator,
_viewStartProvider,
page,
page,
executeViewHierarchy: !partial);
return ViewEngineResult.Found(viewName, view);
}

View File

@ -64,12 +64,12 @@ namespace Microsoft.AspNet.Mvc.Rendering
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();
}
public ViewEngineResult FindView([NotNull]IDictionary<string, object> context, [NotNull]string viewName)
public ViewEngineResult FindView(ActionContext context, string viewName)
{
throw new NotImplementedException();
}

View File

@ -3,6 +3,8 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Routing;
using Moq;
using Xunit;
@ -18,16 +20,18 @@ namespace Microsoft.AspNet.Mvc.Rendering
var provider = new Mock<IViewEngineProvider>();
provider.SetupGet(p => p.ViewEngines)
.Returns(new IViewEngine[0]);
var actionContext = GetActionContext();
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindView(actionContext, viewName);
// Assert
Assert.False(result.Success);
Assert.Empty(result.SearchedLocations);
}
[Fact]
public void FindView_ReturnsNotFoundResult_WhenExactlyOneViewEngineIsRegisteredWhichReturnsNotFoundResult()
{
@ -35,14 +39,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
var viewName = "test-view";
var provider = new Mock<IViewEngineProvider>();
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" }));
provider.SetupGet(p => p.ViewEngines)
.Returns(new[] { engine.Object });
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindView(GetActionContext(), viewName);
// Assert
Assert.False(result.Success);
@ -57,14 +61,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
var provider = new Mock<IViewEngineProvider>();
var engine = new Mock<IViewEngine>();
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));
provider.SetupGet(p => p.ViewEngines)
.Returns(new[] { engine.Object });
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindView(GetActionContext(), viewName);
// Assert
Assert.True(result.Success);
@ -81,11 +85,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
var engine3 = new Mock<IViewEngine>();
var view2 = 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>()));
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));
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));
var provider = new Mock<IViewEngineProvider>();
@ -94,7 +98,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindView(GetActionContext(), viewName);
// Assert
Assert.True(result.Success);
@ -110,11 +114,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
var engine1 = new Mock<IViewEngine>();
var engine2 = 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" }));
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" }));
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" }));
var provider = new Mock<IViewEngineProvider>();
@ -123,7 +127,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindView(GetActionContext(), viewName);
// Assert
Assert.False(result.Success);
@ -141,7 +145,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert
Assert.False(result.Success);
@ -155,14 +159,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
var viewName = "partial-view";
var provider = new Mock<IViewEngineProvider>();
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" }));
provider.SetupGet(p => p.ViewEngines)
.Returns(new[] { engine.Object });
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert
Assert.False(result.Success);
@ -177,14 +181,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
var provider = new Mock<IViewEngineProvider>();
var engine = new Mock<IViewEngine>();
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));
provider.SetupGet(p => p.ViewEngines)
.Returns(new[] { engine.Object });
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert
Assert.True(result.Success);
@ -201,11 +205,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
var engine3 = new Mock<IViewEngine>();
var view2 = 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>()));
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));
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));
var provider = new Mock<IViewEngineProvider>();
@ -214,7 +218,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert
Assert.True(result.Success);
@ -230,11 +234,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
var engine1 = new Mock<IViewEngine>();
var engine2 = 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" }));
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" }));
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" }));
var provider = new Mock<IViewEngineProvider>();
@ -243,11 +247,17 @@ namespace Microsoft.AspNet.Mvc.Rendering
var compositeViewEngine = new CompositeViewEngine(provider.Object);
// Act
var result = compositeViewEngine.FindPartialView(new Dictionary<string, object>(), viewName);
var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName);
// Assert
Assert.False(result.Success);
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 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>()));
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 viewEngine = new Mock<ICompositeViewEngine>();
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>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string";
@ -123,7 +123,7 @@ namespace Microsoft.AspNet.Mvc.Core
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>();
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>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string";
@ -142,7 +142,7 @@ namespace Microsoft.AspNet.Mvc.Core
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>();
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>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
@ -162,7 +162,7 @@ namespace Microsoft.AspNet.Mvc.Core
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = propertyValue, };
var viewEngine = new Mock<ICompositeViewEngine>();
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>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string";

View File

@ -94,7 +94,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectWithScaffoldColumn();
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>()));
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
@ -112,7 +112,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>();
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>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string";
@ -133,7 +133,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>();
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>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string";
@ -154,7 +154,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" };
var viewEngine = new Mock<ICompositeViewEngine>();
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>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
@ -176,7 +176,7 @@ Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = propertyValue, };
var viewEngine = new Mock<ICompositeViewEngine>();
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>()));
var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object);
helper.ViewData["Property1"] = "ViewData string";

View File

@ -151,7 +151,7 @@ namespace Microsoft.AspNet.Mvc.Core
var viewEngine = new Mock<ICompositeViewEngine>();
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));
return viewEngine.Object;

View File

@ -51,12 +51,12 @@ namespace Microsoft.AspNet.Mvc.Rendering
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();
}
public ViewEngineResult FindView([NotNull]IDictionary<string, object> context, [NotNull]string viewName)
public ViewEngineResult FindView(ActionContext context, string viewName)
{
throw new NotImplementedException();
}

View File

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

View File

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

View File

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