在Razor Page中检查Model是否为Null时触发NullReferenceException的原因及解决咨询
在Razor Page中检查Model是否为Null时触发NullReferenceException的原因及解决方法
嘿,我完全懂你现在的困惑——明明是在检查对象是否为空,结果反而抛出了空引用异常,这看起来完全违背逻辑对吧?别着急,这个问题的根源其实藏在一个很容易被忽略的细节里,咱们一步步来拆解。
问题回顾
你创建了一个ASP.NET Core 8的Razor Pages项目,做了这些操作:
- 在
Pages/Shared下创建了名为_Airplane的部分视图,对应的PageModel有PilotName属性 - 在Index页面实例化这个模型并传递给部分视图,一开始运行正常
- 但在
_Airplane.cshtml里添加@if (Model != null)的检查后,反而触发了NullReferenceException
核心原因:错误地给Partial View加上了@page指令
问题就出在你的_Airplane.cshtml第一行的@page上!
@page是Razor Pages的核心指令,它的作用是把当前.cshtml文件标记为一个独立的、可通过路由直接访问的Razor Page。而Partial View(部分视图)本质上是用来被其他页面引用的子视图,根本不需要这个指令。
当你给Partial View加上@page后,这个视图生成的后台类会继承自Page类型,它的Model属性的getter方法内部会依赖完整的页面路由上下文来获取模型。但当你把它作为Partial渲染时,它并没有处于一个独立页面的上下文环境中,此时访问Model属性本身就会触发内部的空引用异常——也就是说,你写的Model != null并不是在判断模型对象是否为空,而是在尝试访问一个内部已经出错的Model属性,所以才抛出了异常。
解决方法:移除Partial View中的@page指令
只需要修改_Airplane.cshtml,删掉第一行的@page:
@model Stackoverflow1.Pages.Shared._AirplaneModel @{ } <p>The name of the pilot is:</p> @if (Model != null) { @if (Model.PilotName != null) { @if (Model.PilotName.Length > 0) { <h4>@Model.PilotName</h4> } } }
现在再运行项目,你会发现之前的空引用异常消失了,Model != null的检查也能正常工作——因为此时这个视图是标准的Partial View,它的Model属性就是你从Index页面传递过来的实例,不会再因为路由上下文缺失而抛出异常。
额外小贴士
- 记住:只有独立的Razor Page(比如
Index.cshtml、About.cshtml这些可以直接通过URL访问的页面)才需要@page指令 - Partial View的命名习惯通常以下划线开头(比如
_Airplane.cshtml),这也能帮助你区分独立页面和部分视图,避免误加@page
内容来源于stack exchange
相关产品推荐
相关产品推荐

