未设置为对象实例的对象引用.使用非空对象

本文关键字:对象 对象引用 设置 实例 | 更新日期: 2023-09-27 17:52:37

我遇到了这个问题,这让我很疯狂,我正在搜索一个网站,它在我的机器上运行得很好,但当我把它上传到gearhost时,它只是吹了这个错误:

对象引用未设置为对象的实例。

描述:在执行过程中发生未处理的异常当前的web请求。请查看堆栈跟踪了解更多信息有关错误及其在代码中的起源的信息。

Exception Details: System。NullReferenceException:对象引用不存在设置为对象的实例。

源错误:

第43行:@if (Model != null)
第44行:{
45行:如果(Model.Any ())
第46行:{

错误出现在第45行,即使我确信我知道它不是空的和IEnumerable。

My Model在razor中的声明如下:

@model IEnumerable<Posada> 

如果我发送一个空搜索,这确实有效,但当我使用返回行或其他不返回任何行的字符串时,这就行不通了。

在我的控制器中,我只是返回一个IEnumerable并将其用作模型。

 IEnumerable<Posada> posadas = unitOfWork.PosadaRepository.Get(includeProperties: "Estado,Lugar")
                .Where(p => p.Nombre.ToLowerInvariant().Contains(query) ||
                            p.Estado.Nombre.ToLowerInvariant().Contains(query) ||
                            p.Lugar.Nombre.ToLowerInvariant().Contains(query))
                .OrderBy(p => p.Id)
                .Skip((page - 1)*pagingInfo.ItemsPerPage)
                .Take(pagingInfo.ItemsPerPage);

未设置为对象实例的对象引用.使用非空对象

似乎NullReferenceException发生时,你枚举IEnumerable(当你执行Any())。IEnumerable不是空的,然后最有可能得到NullReferenceException:

p.Nombre.ToLowerInvariant()
p.Estado.Nombre.ToLowerInvariant()
p.Lugar.Nombre.ToLowerInvariant()
pagingInfo.ItemsPerPage

记住IEnumberable<>仅在需要时对查询求值,因此,正如另一个答案所述,当您使用Any()时,查询会被求值,在这种情况下,Estado或Lugar都可以为空。试试这样写:

(p.Estado!=null &&  p.Estado.Nombre.ToLowerInvariant().Contains(query) )||
(p.Lugar!=null &&    p.Lugar.Nombre.ToLowerInvariant().Contains(query)))