【问题标题】:Nullreference exception when the model is not null模型不为空时的空引用异常
【发布时间】:2013-11-14 23:04:48
【问题描述】:

今天我遇到了奇怪的异常。我的数据库中有两个表,它们有一些链接的列。根据我的应用程序的逻辑,我必须对选择进行更新并将更新的列表发送到我的视图。所以,我的行为是这样的:

return View(repo.Enrollee.ToList().Select(p => {
               p.SpecialtyCode =  repo.EnrolleePlaces.FirstOrDefault(t => 
               t.SpecialtyCode == p.SpecialtyCode).Specialty; 
               return p; 
               }).OrderByDescending(p => p.Update));

当我在Model 上创建foreach 时,一切正常,但是当我尝试使用@Model.Count() 计算模型的项目时,我得到了Nullreference。即使我将foreach 复制到第一个下方,我也会收到Nullreference。有什么想法吗?

【问题讨论】:

  • 您的一个对象显然是null。你已经通过调试器了吗?
  • 只有一行代码时,您将很难调试它。把它拆开。
  • 可能是缓存在某处的旧代码。尝试构建>清洁解决方案和构建>重建。现在会发生什么?正如@MichaelPerrenoud 所建议的那样 - 将代码分成更小的可管理块并且更容易阅读。
  • 是的,所有字段都不为空。这是我的第一个想法,但似乎这不是原因
  • 另一个 +1 用于打破它。如果您传递像return View(enrollees); 这样的变量并在需要时将其分解为 2 或 3 个变量,您将保持理智。在需要的地方还要检查null

标签: c# asp.net asp.net-mvc asp.net-mvc-3


【解决方案1】:

即使你确定你的变量不为空:

如果您使用FirstOrDefault,返回值可能为null,因此您必须在访问.Specialty之前检查它:

p.SpecialtyCode =  repo.EnrolleePlaces.FirstOrDefault(t => 
t.SpecialtyCode == p.SpecialtyCode).Specialty;

您可以使用以下内容:

var someVar = repo.EnrolleePlaces.FirstOrDefault(t => t.SpecialtyCode == p.SpecialtyCode);
p.SpecialtyCode =  someVar == null? null : someVar.Specialty;

【讨论】:

  • Mb 你是对的,我会检查它。但有一件事让我很困惑:当我在我的视图中设置断点时,模型是完全正确的
  • 这是真的。表达(正如我最近发现的)是一种痛苦,你不能在返回时中断并进入表达......我不得不在几周前写自己的ExpressionVisitor,天哪.
  • @JohnH - 同意,随心所欲,小心点 :)
【解决方案2】:

感谢@AlbinSunnanbo 和他的回答here。我有我需要的。刚刚通过调用另一个ToList() 执行了我的查询...

所以,这就是答案:

return View(repo.Enrollee.ToList().Select(p => {
               p.SpecialtyCode =  repo.EnrolleePlaces.FirstOrDefault(t => 
               t.SpecialtyCode == p.SpecialtyCode).Specialty; 
               return p; 
               }).OrderByDescending(p => p.Update).ToList());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多