Layout property needs to be propogated between nested view starts
Fixes #1364
This commit is contained in:
parent
de77c92a0a
commit
75c6327b2e
|
|
@ -150,13 +150,17 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
{
|
{
|
||||||
var viewStarts = _viewStartProvider.GetViewStartPages(_razorPage.Path);
|
var viewStarts = _viewStartProvider.GetViewStartPages(_razorPage.Path);
|
||||||
|
|
||||||
|
string layout = null;
|
||||||
foreach (var viewStart in viewStarts)
|
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);
|
await RenderPageCoreAsync(viewStart, context);
|
||||||
|
layout = viewStart.Layout;
|
||||||
// Copy over interesting properties from the ViewStart page to the entry page.
|
|
||||||
_razorPage.Layout = viewStart.Layout;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy over interesting properties from the ViewStart page to the entry page.
|
||||||
|
_razorPage.Layout = layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RenderLayoutAsync(ViewContext context,
|
private async Task RenderLayoutAsync(ViewContext context,
|
||||||
|
|
|
||||||
|
|
@ -196,5 +196,25 @@ component-content";
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(expected, body.Trim());
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -714,6 +714,80 @@ section-content-2";
|
||||||
Assert.True(executed);
|
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()
|
private static TextWriter CreateBufferedWriter()
|
||||||
{
|
{
|
||||||
var mockWriter = new Mock<TextWriter>();
|
var mockWriter = new Mock<TextWriter>();
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
index-content
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
<title>@ViewData["title"]</title>
|
||||||
|
@RenderBody()
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
@{
|
||||||
|
ViewData["Title"] = "viewstart-value";
|
||||||
|
}
|
||||||
|
@Layout
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
@{
|
||||||
|
Layout = "~/Views/NestedViewStarts/NestedViewStarts/Layout.cshtml";
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue