.
+
+ var viewData = new ViewDataDictionary(MetadataProvider, ViewData.ModelState)
+ {
+ Model = model,
+ };
return new PartialViewResult
{
ViewName = viewName,
- ViewData = ViewData
+ ViewData = viewData
};
}
diff --git a/src/Mvc/Mvc.RazorPages/test/PageModelTest.cs b/src/Mvc/Mvc.RazorPages/test/PageModelTest.cs
index bfb8d6991c..762f22e5d1 100644
--- a/src/Mvc/Mvc.RazorPages/test/PageModelTest.cs
+++ b/src/Mvc/Mvc.RazorPages/test/PageModelTest.cs
@@ -1898,13 +1898,15 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
public void PartialView_WithName()
{
// Arrange
- var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary());
+ var modelMetadataProvider = new EmptyModelMetadataProvider();
+ var viewData = new ViewDataDictionary(modelMetadataProvider, new ModelStateDictionary());
var pageModel = new TestPageModel
{
PageContext = new PageContext
{
ViewData = viewData
- }
+ },
+ MetadataProvider = modelMetadataProvider,
};
// Act
@@ -1913,20 +1915,22 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
// Assert
Assert.NotNull(result);
Assert.Equal("LoginStatus", result.ViewName);
- Assert.Same(viewData, result.ViewData);
+ Assert.Null(result.Model);
}
[Fact]
public void PartialView_WithNameAndModel()
{
// Arrange
- var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary());
+ var modelMetadataProvider = new EmptyModelMetadataProvider();
+ var viewData = new ViewDataDictionary(modelMetadataProvider, new ModelStateDictionary());
var pageModel = new TestPageModel
{
PageContext = new PageContext
{
ViewData = viewData
- }
+ },
+ MetadataProvider = modelMetadataProvider,
};
var model = new { Username = "Admin" };
@@ -1937,7 +1941,6 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
Assert.NotNull(result);
Assert.Equal("LoginStatus", result.ViewName);
Assert.Equal(model, result.Model);
- Assert.Same(viewData, result.ViewData);
}
[Fact]
diff --git a/src/Mvc/Mvc.RazorPages/test/PageTest.cs b/src/Mvc/Mvc.RazorPages/test/PageTest.cs
index f92db3a934..634986bdff 100644
--- a/src/Mvc/Mvc.RazorPages/test/PageTest.cs
+++ b/src/Mvc/Mvc.RazorPages/test/PageTest.cs
@@ -1700,14 +1700,17 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
public void PartialView_WithName()
{
// Arrange
- var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary());
+ var modelMetadataProvider = new EmptyModelMetadataProvider();
+ var viewData = new ViewDataDictionary(modelMetadataProvider, new ModelStateDictionary());
var pageModel = new TestPage
{
ViewContext = new ViewContext
{
ViewData = viewData
- }
+ },
+ MetadataProvider = modelMetadataProvider,
};
+ viewData.Model = pageModel;
// Act
var result = pageModel.Partial("LoginStatus");
@@ -1715,21 +1718,24 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
// Assert
Assert.NotNull(result);
Assert.Equal("LoginStatus", result.ViewName);
- Assert.Same(viewData, result.ViewData);
+ Assert.Null(result.Model);
}
[Fact]
public void PartialView_WithNameAndModel()
{
// Arrange
- var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary());
+ var modelMetadataProvider = new EmptyModelMetadataProvider();
+ var viewData = new ViewDataDictionary(modelMetadataProvider, new ModelStateDictionary());
var pageModel = new TestPage
{
ViewContext = new ViewContext
{
ViewData = viewData
- }
+ },
+ MetadataProvider = modelMetadataProvider,
};
+ viewData.Model = pageModel;
var model = new { Username = "Admin" };
// Act
@@ -1739,7 +1745,6 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
Assert.NotNull(result);
Assert.Equal("LoginStatus", result.ViewName);
Assert.Equal(model, result.Model);
- Assert.Same(viewData, result.ViewData);
}
[Fact]
diff --git a/src/Mvc/samples/MvcSandbox/Pages/PagesHome.cshtml b/src/Mvc/samples/MvcSandbox/Pages/PagesHome.cshtml
index d44cbb6cd2..d4d5241a60 100644
--- a/src/Mvc/samples/MvcSandbox/Pages/PagesHome.cshtml
+++ b/src/Mvc/samples/MvcSandbox/Pages/PagesHome.cshtml
@@ -1,5 +1,5 @@
@page
-@model TestModel
+@model PagesHome
@{
ViewData["Title"] = "Hello from pages";
diff --git a/src/Mvc/samples/MvcSandbox/Models/TestModel.cs b/src/Mvc/samples/MvcSandbox/Pages/PagesHome.cshtml.cs
similarity index 92%
rename from src/Mvc/samples/MvcSandbox/Models/TestModel.cs
rename to src/Mvc/samples/MvcSandbox/Pages/PagesHome.cshtml.cs
index 29e881e9a4..f33a1370fb 100644
--- a/src/Mvc/samples/MvcSandbox/Models/TestModel.cs
+++ b/src/Mvc/samples/MvcSandbox/Pages/PagesHome.cshtml.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages;
namespace MvcSandbox
{
- public class TestModel : PageModel
+ public class PagesHome : PageModel
{
public string Name { get; private set; } = "World";
diff --git a/src/Mvc/test/Mvc.FunctionalTests/RazorPagesTest.cs b/src/Mvc/test/Mvc.FunctionalTests/RazorPagesTest.cs
index 8ecd44c0bd..3fcb25f6fb 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/RazorPagesTest.cs
+++ b/src/Mvc/test/Mvc.FunctionalTests/RazorPagesTest.cs
@@ -144,23 +144,43 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
}
[Fact]
- public async Task Page_Handler_ReturnPartialWithoutModel()
+ public async Task PageWithoutModel_ReturnPartial()
{
// Act
- var document = await Client.GetHtmlDocumentAsync("RenderPartialWithoutModel");
+ using var document = await Client.GetHtmlDocumentAsync("PageWithoutModelRenderPartial");
var element = document.RequiredQuerySelector("#content");
- Assert.Equal("Welcome, Guest", element.TextContent);
+ Assert.Equal("Hello from Razor Page", element.TextContent);
}
[Fact]
- public async Task Page_Handler_ReturnPartialWithModel()
+ public async Task PageWithModel_Works()
{
// Act
- var document = await Client.GetHtmlDocumentAsync("RenderPartialWithModel");
+ using var document = await Client.GetHtmlDocumentAsync("RenderPartial");
var element = document.RequiredQuerySelector("#content");
- Assert.Equal("Welcome, Admin", element.TextContent);
+ Assert.Equal("Hello from RenderPartialModel", element.TextContent);
+ }
+
+ [Fact]
+ public async Task PageWithModel_PartialUsingPageModelWorks()
+ {
+ // Act
+ using var document = await Client.GetHtmlDocumentAsync("RenderPartial/UsePageModelAsPartialModel");
+
+ var element = document.RequiredQuerySelector("#content");
+ Assert.Equal("Hello from RenderPartialWithModel", element.TextContent);
+ }
+
+ [Fact]
+ public async Task PageWithModel_PartialWithNoModel()
+ {
+ // Act
+ using var document = await Client.GetHtmlDocumentAsync("RenderPartial/NoPartialModel");
+
+ var element = document.RequiredQuerySelector("#content");
+ Assert.Equal("Hello default", element.TextContent);
}
[Fact]
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/Models/RenderPartialModel.cs b/src/Mvc/test/WebSites/RazorPagesWebSite/Models/RenderPartialModel.cs
new file mode 100644
index 0000000000..4d4dd804ee
--- /dev/null
+++ b/src/Mvc/test/WebSites/RazorPagesWebSite/Models/RenderPartialModel.cs
@@ -0,0 +1,10 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+namespace RazorPagesWebSite.Models
+{
+ public class RenderPartialModel
+ {
+ public string Value { get; set; }
+ }
+}
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/PageWithoutModelRenderPartial.cshtml b/src/Mvc/test/WebSites/RazorPagesWebSite/PageWithoutModelRenderPartial.cshtml
new file mode 100644
index 0000000000..11f26d2171
--- /dev/null
+++ b/src/Mvc/test/WebSites/RazorPagesWebSite/PageWithoutModelRenderPartial.cshtml
@@ -0,0 +1,6 @@
+@page
+@using RazorPagesWebSite.Models
+
+@functions {
+ public IActionResult OnGet() => Partial("_RenderPartial", new RenderPartialModel { Value = "Hello from Razor Page" });
+}
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartial.cshtml b/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartial.cshtml
new file mode 100644
index 0000000000..87e98ef7bc
--- /dev/null
+++ b/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartial.cshtml
@@ -0,0 +1,7 @@
+@page "{handler?}"
+@model RazorPagesWebSite.RenderPartialWithModel
+
+@{
+ throw new Exception("This should not be called");
+
+}
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartial.cshtml.cs b/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartial.cshtml.cs
new file mode 100644
index 0000000000..03f6a00337
--- /dev/null
+++ b/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartial.cshtml.cs
@@ -0,0 +1,20 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using RazorPagesWebSite.Models;
+
+namespace RazorPagesWebSite
+{
+ public class RenderPartialWithModel : PageModel
+ {
+ public string Text { get; set; } = $"Hello from {nameof(RenderPartialWithModel)}";
+
+ public IActionResult OnGet() => Partial("_RenderPartial", new RenderPartialModel { Value = $"Hello from {nameof(RenderPartialModel)}" });
+
+ public IActionResult OnGetUsePageModelAsPartialModel() => Partial("_RenderPartialPageModel", this);
+
+ public IActionResult OnGetNoPartialModel() => Partial("_RenderPartial");
+ }
+}
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartialWithModel.cs b/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartialWithModel.cs
deleted file mode 100644
index 82711aed2e..0000000000
--- a/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartialWithModel.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace RazorPagesWebSite
-{
- public class RenderPartialWithModel : PageModel
- {
- public IActionResult OnGet() => Partial("_PartialWithModel", this);
-
- public string Username => "Admin";
- }
-}
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartialWithModel.cshtml b/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartialWithModel.cshtml
deleted file mode 100644
index 27d507ed75..0000000000
--- a/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartialWithModel.cshtml
+++ /dev/null
@@ -1,4 +0,0 @@
-@page
-@model RazorPagesWebSite.RenderPartialWithModel
-
-The partial will be loaded here ...
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartialWithoutModel.cshtml b/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartialWithoutModel.cshtml
deleted file mode 100644
index b817a76e67..0000000000
--- a/src/Mvc/test/WebSites/RazorPagesWebSite/RenderPartialWithoutModel.cshtml
+++ /dev/null
@@ -1,5 +0,0 @@
-@page
-
-@functions {
- public IActionResult OnGet() => Partial("_PartialWithoutModel");
-}
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_PartialWithoutModel.cshtml b/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_PartialWithoutModel.cshtml
deleted file mode 100644
index 40b6bbaf56..0000000000
--- a/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_PartialWithoutModel.cshtml
+++ /dev/null
@@ -1 +0,0 @@
-Welcome, Guest
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_RenderPartial.cshtml b/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_RenderPartial.cshtml
new file mode 100644
index 0000000000..389bb80c65
--- /dev/null
+++ b/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_RenderPartial.cshtml
@@ -0,0 +1,4 @@
+@using RazorPagesWebSite.Models
+@model RenderPartialModel
+
+@(Model?.Value ?? "Hello default")
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_PartialWithModel.cshtml b/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_RenderPartialPageModel.cshtml
similarity index 50%
rename from src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_PartialWithModel.cshtml
rename to src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_RenderPartialPageModel.cshtml
index 5c8194f423..46bceaf7ad 100644
--- a/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_PartialWithModel.cshtml
+++ b/src/Mvc/test/WebSites/RazorPagesWebSite/Views/Shared/_RenderPartialPageModel.cshtml
@@ -1,3 +1,3 @@
@model RazorPagesWebSite.RenderPartialWithModel
-Welcome, @Model.Username
\ No newline at end of file
+@Model.Text
\ No newline at end of file