【发布时间】:2018-01-26 09:13:48
【问题描述】:
TL; DR 在 ASP.NET Core 2.0 中是否可以使用“部分页面”?如果是这样,为什么我会收到下面描述的错误?
我一直在搞乱 ASP.NET 2.0 的新 Razor Page 功能,并且在处理部分问题时遇到了一些麻烦。上面链接的文档在几个地方都提到了“部分”,但仅限于说一些神秘的东西,例如“您与 MVC 控制器和传统 Razor 视图一起使用的布局、模板和部分正常工作。”它们是指partial Views,就像我们习惯的那样,还是某种新的部分页面?他们表明,名称中带有常规Partial 后缀的文件可以放在Pages/ 文件夹中,但他们提到的文件(例如_ValidationScriptsPartial.cshtml)没有@page 声明。如果“部分页面”确实是一个新事物,那么我希望以下最小场景可以工作:
-
一个名为
Derp.cshtml的页面文件:@page @namespace MyApp.Pages @model DerpModel <p>Member 1: @Model.Member1</p> <p>Member 2: @Model.Member2</p> -
同一目录下名为
Derp.cshtml.cs的类文件(嵌套在VS 2017的解决方案资源管理器中的第一个下),包含以下类:namespace MyApp.Pages { public class DerpModel : PageModel { public void OnGet() { Member1 = "Derp Member1"; Member2 = "Derp Member2"; } public string Member1 { get; set; } public string Member2 { get; set; } } } -
同一目录下的第二个Page文件
DerpWrapper.cshtml,代码如下:@page "{id}" @namespace MyApp.Pages @model DerpModel <p>Outer Member 1: @Model.Member1</p> <p>Outer Member 2: @Model.Member2</p> @Html.Partial("Derp", Model) 当然还有一个声明
@namespace MyApp.Pages的_ViewImports文件
请注意,两个 Razor 页面具有相同的 @model 类型,第二个页面基本上通过调用 Html.Partial() 来结束第一个页面并传递其 Model。这应该都是非常标准的东西,但是在导航到 http://localhost:xxx/DerpWrapper 时,由于带有以下堆栈跟踪的 NullReferenceException,我得到了 500 响应。
MyApp.Pages.Derp_Page.get_Model()
MyApp.Pages.Derp_Page+<ExecuteAsync>d__0.MoveNext() in Derp.cshtml
+
<p>Inner Member1: @Model.Member1</p>
...
MyApp.Pages.DerpWrapper_Page+<ExecuteAsync>d__0.MoveNext() in DerpWrapper.cshtml
+
@Html.Partial("Derp", Model)
...
为什么“包装”页面的Model 等于 null?有没有办法定义一个 Razor 页面并使用 Html.Partial() 从另一个页面或视图显示它?
【问题讨论】:
-
我对 ASP.NET Core 不是很熟悉,但是新的
@page指令不会导致页面表现为操作吗?这将暗示必须使用子动作而不是.Partial 来嵌入它,但谁知道呢。无论如何,我只是尝试从部分 Derp.cshtml 中删除@page。 -
剃须刀页面部分在此处描述learnrazorpages.com/razor-pages/partial-pages 省略部分的@page 将解决 nullrefex
标签: c# razor asp.net-core asp.net-core-mvc .net-core