From 155bde0fcf54f7e1c602957ea380b09bfb4f6b29 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 18 Nov 2015 14:59:01 -0800 Subject: [PATCH] Pass in the area name instead of the view name to a parameter that requires an area name. Fixes #3556 --- .../RazorViewEngine.cs | 2 +- .../RazorViewEngineTest.cs | 134 +++++++++++++++++- 2 files changed, 133 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs index 9d93a56733..202030b839 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs @@ -334,7 +334,7 @@ namespace Microsoft.AspNet.Mvc.Razor var cacheKey = new ViewLocationCacheKey( expanderContext.ViewName, expanderContext.ControllerName, - expanderContext.ViewName, + expanderContext.AreaName, expanderContext.IsMainPage, expanderValues); diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs index 76c6f1ea3b..83b1f488ef 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs @@ -284,10 +284,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test // Assert Assert.False(result.Success); - Assert.Equal(new[] { + Assert.Equal(new[] + { "/Areas/foo/Views/bar/viewName.cshtml", "/Areas/foo/Views/Shared/viewName.cshtml", - "/Views/Shared/full.cshtml", + "/Views/Shared/viewName.cshtml", }, result.SearchedLocations); } @@ -544,6 +545,135 @@ namespace Microsoft.AspNet.Mvc.Razor.Test Assert.Same(page, view.RazorPage); } + [Theory] + [InlineData(false)] + [InlineData(true)] + public void FindView_CreatesDifferentCacheEntries_ForAreaViewsAndNonAreaViews(bool isMainPage) + { + // Arrange + var pageFactory = new Mock(); + var areaPage = Mock.Of(); + var nonAreaPage = Mock.Of(); + pageFactory + .Setup(p => p.CreateFactory("/Areas/Admin/Views/Home/Index.cshtml")) + .Returns(new RazorPageFactoryResult(() => areaPage, new IChangeToken[0])); + pageFactory + .Setup(p => p.CreateFactory("/Views/Home/Index.cshtml")) + .Returns(new RazorPageFactoryResult(() => nonAreaPage, new IChangeToken[0])); + + var viewEngine = new TestableRazorViewEngine( + pageFactory.Object, + GetOptionsAccessor()); + + // Act 1 + var areaContext = GetActionContext(new Dictionary() + { + {"area", "Admin"}, + {"controller", "Home"}, + }); + var result1 = viewEngine.FindView(areaContext, "Index", isMainPage); + + // Assert 1 + Assert.NotNull(result1); + pageFactory.Verify(p => p.CreateFactory("/Areas/Admin/Views/Home/Index.cshtml"), Times.Once()); + pageFactory.Verify(p => p.CreateFactory("/Views/Home/Index.cshtml"), Times.Never()); + var view1 = Assert.IsType(result1.View); + Assert.Same(areaPage, view1.RazorPage); + + // Act 2 + var nonAreaContext = GetActionContext(new Dictionary() + { + {"controller", "Home"}, + }); + var result2 = viewEngine.FindView(nonAreaContext, "Index", isMainPage); + + // Assert 2 + Assert.NotNull(result2); + pageFactory.Verify(p => p.CreateFactory("/Areas/Admin/Views/Home/Index.cshtml"), Times.Once()); + pageFactory.Verify(p => p.CreateFactory("/Views/Home/Index.cshtml"), Times.Once()); + var view2 = Assert.IsType(result2.View); + Assert.Same(nonAreaPage, view2.RazorPage); + + // Act 3 + // Ensure we're getting cached results. + var result3 = viewEngine.FindView(areaContext, "Index", isMainPage); + var result4 = viewEngine.FindView(nonAreaContext, "Index", isMainPage); + + // Assert 4 + pageFactory.Verify(p => p.CreateFactory("/Areas/Admin/Views/Home/Index.cshtml"), Times.Once()); + pageFactory.Verify(p => p.CreateFactory("/Views/Home/Index.cshtml"), Times.Once()); + + var view3 = Assert.IsType(result3.View); + Assert.Same(areaPage, view3.RazorPage); + var view4 = Assert.IsType(result4.View); + Assert.Same(nonAreaPage, view4.RazorPage); + } + + [Theory] + [InlineData(false)] + [InlineData(true)] + public void FindView_CreatesDifferentCacheEntries_ForDifferentAreas(bool isMainPage) + { + // Arrange + var pageFactory = new Mock(); + var areaPage1 = Mock.Of(); + var areaPage2 = Mock.Of(); + pageFactory + .Setup(p => p.CreateFactory("/Areas/Marketing/Views/Home/Index.cshtml")) + .Returns(new RazorPageFactoryResult(() => areaPage1, new IChangeToken[0])); + pageFactory + .Setup(p => p.CreateFactory("/Areas/Sales/Views/Home/Index.cshtml")) + .Returns(new RazorPageFactoryResult(() => areaPage2, new IChangeToken[0])); + + var viewEngine = new TestableRazorViewEngine( + pageFactory.Object, + GetOptionsAccessor()); + + // Act 1 + var areaContext1 = GetActionContext(new Dictionary() + { + {"area", "Marketing"}, + {"controller", "Home"}, + }); + var result1 = viewEngine.FindView(areaContext1, "Index", isMainPage); + + // Assert 1 + Assert.NotNull(result1); + pageFactory.Verify(p => p.CreateFactory("/Areas/Marketing/Views/Home/Index.cshtml"), Times.Once()); + pageFactory.Verify(p => p.CreateFactory("/Areas/Sales/Views/Home/Index.cshtml"), Times.Never()); + var view1 = Assert.IsType(result1.View); + Assert.Same(areaPage1, view1.RazorPage); + + // Act 2 + var areaContext2 = GetActionContext(new Dictionary() + { + {"controller", "Home"}, + {"area", "Sales"}, + }); + var result2 = viewEngine.FindView(areaContext2, "Index", isMainPage); + + // Assert 2 + Assert.NotNull(result2); + pageFactory.Verify(p => p.CreateFactory("/Areas/Marketing/Views/Home/Index.cshtml"), Times.Once()); + pageFactory.Verify(p => p.CreateFactory("/Areas/Sales/Views/Home/Index.cshtml"), Times.Once()); + var view2 = Assert.IsType(result2.View); + Assert.Same(areaPage2, view2.RazorPage); + + // Act 3 + // Ensure we're getting cached results. + var result3 = viewEngine.FindView(areaContext1, "Index", isMainPage); + var result4 = viewEngine.FindView(areaContext2, "Index", isMainPage); + + // Assert 4 + pageFactory.Verify(p => p.CreateFactory("/Areas/Marketing/Views/Home/Index.cshtml"), Times.Once()); + pageFactory.Verify(p => p.CreateFactory("/Areas/Sales/Views/Home/Index.cshtml"), Times.Once()); + + var view3 = Assert.IsType(result3.View); + Assert.Same(areaPage1, view3.RazorPage); + var view4 = Assert.IsType(result4.View); + Assert.Same(areaPage2, view4.RazorPage); + } + [Theory] [MemberData(nameof(ViewLocationExpanderTestData))] public void FindView_UsesViewLocationExpandersToLocateViews(