在 ASP.NET Core 中将模型从 Index 传递到 _Layout 再到 _Header 会导致 get_Model() 出现 NullReferenceException

问题描述 投票:0回答:1

我有一个使用 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,Nullable

1 statusCode) at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable
1 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 上下文)

为什么

Header
模型为空?有没有更好的方法来使用
Index
完成从
_Header
_Layout
的数据传递?

我尝试过添加调试语句。看起来

ViewData["_Header"]
正在工作,但在超过
Html.PartialAsync("_Header", ViewData["_Header"])
的某个地方,模型值变为空。

c# asp.net-core razor-pages
1个回答
0
投票

我从

@page
中删除了
_Header.cshtml
注释,页面正确呈现,没有错误。

© www.soinside.com 2019 - 2024. All rights reserved.