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);
|
||||
|
||||
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,
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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>();
|
||||
|
|
|
|||
|
|
@ -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