Layout property needs to be propogated between nested view starts

Fixes #1364
This commit is contained in:
Pranav K 2014-10-15 12:33:28 -07:00
parent de77c92a0a
commit 75c6327b2e
8 changed files with 127 additions and 4 deletions

View File

@ -150,13 +150,17 @@ namespace Microsoft.AspNet.Mvc.Razor
{
var viewStarts = _viewStartProvider.GetViewStartPages(_razorPage.Path);
string layout = null;
foreach (var viewStart in viewStarts)
{
// Copy the layout value from the previous view start (if any) to the current.
viewStart.Layout = layout;
await RenderPageCoreAsync(viewStart, context);
// Copy over interesting properties from the ViewStart page to the entry page.
_razorPage.Layout = viewStart.Layout;
layout = viewStart.Layout;
}
// Copy over interesting properties from the ViewStart page to the entry page.
_razorPage.Layout = layout;
}
private async Task RenderLayoutAsync(ViewContext context,

View File

@ -196,5 +196,25 @@ component-content";
// Assert
Assert.Equal(expected, body.Trim());
}
[Fact]
public async Task LayoutValueIsPassedBetweenNestedViewStarts()
{
// Arrange
var expected = string.Join(Environment.NewLine,
"<title>viewstart-value</title>",
"",
"~/Views/NestedViewStarts/NestedViewStarts/Layout.cshtml",
"index-content");
var server = TestServer.Create(_provider, _app);
var client = server.CreateClient();
// Act
var body = await client.GetStringAsync("http://localhost/NestedViewStarts");
// Assert
Assert.Equal(expected, body.Trim());
}
}
}
}

View File

@ -714,6 +714,80 @@ section-content-2";
Assert.True(executed);
}
[Fact]
public async Task RenderAsync_CopiesLayoutPropertyFromViewStart()
{
// Arrange
var expectedViewStart = "Layout1";
var expectedPage = "Layout2";
string actualViewStart = null;
string actualPage = null;
var page = new TestableRazorPage(v =>
{
actualPage = v.Layout;
// Clear it out because we don't care about rendering the layout in this test.
v.Layout = null;
});
var viewStart1 = new TestableRazorPage(v =>
{
v.Layout = expectedViewStart;
});
var viewStart2 = new TestableRazorPage(v =>
{
actualViewStart = v.Layout;
v.Layout = expectedPage;
});
var pageFactory = Mock.Of<IRazorPageFactory>();
var view = new RazorView(pageFactory,
Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider(viewStart1, viewStart2));
view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view);
// Act
await view.RenderAsync(viewContext);
// Assert
Assert.Equal(expectedViewStart, actualViewStart);
Assert.Equal(expectedPage, actualPage);
}
[Fact]
public async Task ResettingLayout_InViewStartCausesItToBeResetInPage()
{
// Arrange
var expected = "Layout";
string actual = null;
var page = new TestableRazorPage(v =>
{
Assert.Null(v.Layout);
});
var viewStart1 = new TestableRazorPage(v =>
{
v.Layout = expected;
});
var viewStart2 = new TestableRazorPage(v =>
{
actual = v.Layout;
v.Layout = null;
});
var pageFactory = Mock.Of<IRazorPageFactory>();
var view = new RazorView(pageFactory,
Mock.Of<IRazorPageActivator>(),
CreateViewStartProvider(viewStart1, viewStart2));
view.Contextualize(page, isPartial: false);
var viewContext = CreateViewContext(view);
// Act
await view.RenderAsync(viewContext);
// Assert
Assert.Equal(expected, actual);
}
private static TextWriter CreateBufferedWriter()
{
var mockWriter = new Mock<TextWriter>();

View File

@ -0,0 +1,15 @@
// 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 Microsoft.AspNet.Mvc;
namespace RazorWebSite.Controllers
{
public class NestedViewStartsController : Controller
{
public ViewResult Index()
{
return View("NestedViewStarts/Index");
}
}
}

View File

@ -0,0 +1 @@
index-content

View File

@ -0,0 +1,2 @@
<title>@ViewData["title"]</title>
@RenderBody()

View File

@ -0,0 +1,4 @@
@{
ViewData["Title"] = "viewstart-value";
}
@Layout

View File

@ -0,0 +1,3 @@
@{
Layout = "~/Views/NestedViewStarts/NestedViewStarts/Layout.cshtml";
}