我有一个使用 Razor 页面的 ASP.NET Core 8.0 项目。当我访问
http://localhost:5###/
并且使用 ViewData["_Header"]
将数据从 Index
页面传递到 _Layout
页面到 _Header
页面时,_Header
页面会在 get_Model()
上抛出 NullReferenceException。
Index.cshtml
:
@page
@{
Layout = "_Layout";
ViewData["_Header"] = new DemoForStackOverflow.Pages.Shared.Header() {IsArriving = true};
}
<h2>some content</h2>
_Layout.cshtml
:
<!DOCTYPE html>
<html>
<head>
<title>Demo for Stack Overflow</title>
</head>
<body>
<div id="header">
@await Html.PartialAsync("_Header", ViewData["_Header"])
</div>
<h1>Appears on every page below header and above body</h1>
<div id="body">
@RenderBody()
</div>
</body>
</html>
_Header.cshtml
:
@page
@model DemoForStackOverflow.Pages.Shared.Header
@if (Model.IsArriving)
{
<p>Hello</p>
}
else
{
<p>Goodbye</p>
}
_Header.csthml.cs
:
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace DemoForStackOverflow.Pages.Shared;
public class Header : PageModel
{
public bool IsArriving { get; set; }
}
这是完整的异常消息和堆栈跟踪:
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
执行请求时发生未处理的异常。
System.NullReferenceException:未将对象引用设置为对象的实例。
在 AspNetCoreGenerateDocument.Pages_Shared__Header.get_Model()
在 /home/RF/DemoForStackOverflow/Pages/Shared/_Header.cshtml 中的 AspNetCoreGenerateDocument.Pages_Shared__Header.ExecuteAsync() 处:第 4 行
在 Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage 页面,ViewContext 上下文)
在 Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage 页面,ViewContext 上下文,布尔 invokeViewStarts)
在 Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext 上下文) 在 Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper.RenderPartialCoreAsync(字符串partialViewName,对象模型,ViewDataDictionary viewData,TextWriter writer) 在 Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper.PartialAsync(字符串partialViewName,对象模型,ViewDataDictionary viewData) 在 /home/RF/DemoForStackOverflow/Pages/Shared/_Layout.cshtml 中的 AspNetCoreGenerateDocument.Pages_Shared__Layout.b__8_1() 处:第 8 行 在 Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.SetOutputContentAsync() 在 AspNetCoreGenerateDocument.Pages_Shared__Layout.ExecuteAsync() 在 Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage 页面,ViewContext 上下文) 在 Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage 页面、ViewContext 上下文、布尔 invokeViewStarts) 在 Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderLayoutAsync(ViewContext 上下文,ViewBufferTextWriter bodyWriter) 在 Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext 上下文) 在 Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext,字符串 contentType,Nullable1 statusCode) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|30_0[TFilter,TFilterAsync](ResourceInvoker 调用程序、任务lastTask、状态下一个、范围范围、对象状态、布尔值已完成) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.Rethrow(ResultExecutedContextSealed 上下文) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.ResultNext[TFilter,TFilterAsync](状态&下一个,范围&范围,对象&状态,布尔&已完成) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.InvokeResultFilters() --- 先前位置的堆栈跟踪结束 --- 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|25_0(ResourceInvoker 调用程序、任务lastTask、状态下一个、范围范围、对象状态、布尔值已完成) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.Rethrow(ResourceExecutedContextSealed 上下文) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.Next(状态与下一个、范围与范围、对象与状态、布尔值与已完成) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.InvokeFilterPipelineAsync() --- 先前位置的堆栈跟踪结束 --- 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序、任务任务、IDisposable 范围) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序、任务任务、IDisposable 范围) 在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext 上下文)1 statusCode) at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable
为什么
Header
模型为空?有没有更好的方法来使用 Index
完成从 _Header
到 _Layout
的数据传递?
我尝试过添加调试语句。看起来
ViewData["_Header"]
正在工作,但在超过 Html.PartialAsync("_Header", ViewData["_Header"])
的某个地方,模型值变为空。
我从
@page
中删除了 _Header.cshtml
注释,页面正确呈现,没有错误。