首页 > 解决方案 > MVC Razor 对象引用未设置为对象的实例

问题描述

我遇到了一个我觉得非常不寻常的问题,我有一个包含实体对象的视图模型,在这种情况下它是一顿饭,但是如果您访问该页面但还没有吃饭,它可能为空,所以我在 razor 中检查它,在检查它的地方,在 null check if 语句的末尾,我得到了错误:

MVC Razor 对象引用未设置为对象 MYAPP.Models.ViewModels.MealViewModel.CurrentMeal.get 的实例返回 null。

光标指向 if 语句的右大括号:

@if(Model.CurrentMeal != null)
{
  // html, but still throws if removed and just if exists
} // exception pointer points to this line on crash

CurrentMeal 在给定的执行中确实为空,但这就是检查的重点。如果我删除花括号内的所有 html,它仍然会引发错误。如果我只是在其中输出任何内容,它仍然会抛出。当有 CurrentMeal 时,代码可以正常工作。我尝试向视图模型 HasMeal 添加一个属性并在视图模型中处理它,以查看它是否只是我缺少的 RAZOR 格式中的某些内容并得到了相同的错误。它指向大括号而不是 if 条件本身也很奇怪。除此之外,我已经删除了整个 if 并且它工作正常,如果我只是渲染 if 条件的结果,它仍然会在它为 null 时抛出,所以它应该只在页面上渲染 true 或 false,而是抛出一个错误。这里真的很奇怪,

<div>
  @if(Model.CurrentMeal != null)
  {
   // Render some controls to work with the meal
  }
  <div>Some controls to always have with or without a meal</div>
  @if(Model.CurrentMeal != null)
  {
   // Render some controls to work with the meal
  }
</div>

它在大括号的第二个错误,而不是第一个错误。我已经用一顿有效的饭菜测试了几个星期的页面,现在在没有饭菜的情况下进行了测试,吃饭时一切正常。如果只删除 if 语句,它就可以正常工作。

public class MealViewModel
{
  public Meal CurrentMeal { get; set; } // entity framework object
  // ... additional properties
}

谢谢你的帮助。

标签: c#asp.netasp.net-mvcentity-frameworkrazor

解决方案


我能够确定问题所在。错误指针位于错误的位置。嵌套在最后大括号下方的 HTML 中是另一个没有检查 Meal 对象上的 null 的引用,一旦这些引用也包含在 null 检查中,页面就会按预期加载。正如我所担心的,错误并不真正在它指向的位置。如果您发现此问题并正在寻找类似的问题,请查找除 RAZOR 中指向的确切位置之外的其他位置,我的位置在 div 标记中大约 10 行。


推荐阅读