C# 对象引用未设置为对象的实例。使用非空对象。

C# 对象引用未设置为对象的实例。使用非空对象。,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,好吧,我遇到了一个让我发疯的问题,我正在搜索一个网站,它在我的机器上运行得很好,但当我将它上传到gearhost时,它就被以下错误所破坏: 对象引用未设置为对象的实例 描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源 异常详细信息:System.NullReferenceException:对象引用不存在 设置为对象的实例 源错误: 第43行:@if(Model!=null) 第44行:{ 第45行: 如果(Model.Any(

好吧,我遇到了一个让我发疯的问题,我正在搜索一个网站,它在我的机器上运行得很好,但当我将它上传到gearhost时,它就被以下错误所破坏:

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

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

异常详细信息:System.NullReferenceException:对象引用不存在 设置为对象的实例

源错误:

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

错误出现在第45行,尽管我确信我知道它不是null,它和IEnumerable

我在razor中的模型声明如下:

@model IEnumerable<Posada> 
@model IEnumerable
如果我发送一个空的搜索,这是可行的,但当我使用一个返回行的字符串或其他不返回任何行的字符串时,这是行不通的

在我的控制器中,我只返回一个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);
IEnumerable posadas=unitOfWork.PosadaRepository.Get(包括属性:“Estado,Lugar”)
.Where(p=>p.Nombre.ToLowerInvariant().Contains(查询)||
p、 Estado.Nombre.ToLowerInvariant().Contains(查询)||
p、 Lugar.Nombre.ToLowerInvariant().Contains(查询))
.OrderBy(p=>p.Id)
.Skip((第1页)*分页信息项页)
.获取(分页信息项目页面);

似乎
NullReferenceException
发生在枚举
IEnumerable
(执行
Any()
)时。
IEnumerable
不为null,然后最有可能得到NullReferenceException:

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

当您枚举
IEnumerable
(当您执行
Any()
)时,似乎会发生
NullReferenceException
IEnumerable
不为空,很可能会发生NullReferenceException:

p.Nombre.ToLowerInvariant()
p.Estado.Nombre.ToLowerInvariant()
p.Lugar.Nombre.ToLowerInvariant()
pagingInfo.ItemsPerPage
请记住,IEnumberable仅在需要时对查询求值,正如另一个答案所述,当您使用Any()时,将对查询求值,在这种情况下,Estado或Lugar都可以为null。请尝试以下操作:

(p.Estado!=null &&  p.Estado.Nombre.ToLowerInvariant().Contains(query) )||
(p.Lugar!=null &&    p.Lugar.Nombre.ToLowerInvariant().Contains(query)))
请记住,IEnumberable仅在需要时对查询求值,正如另一个答案所述,当您使用Any()时,将对查询求值,在这种情况下,Estado或Lugar都可以为null。请尝试以下操作:

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

但是,只要将模型设置为
IEnumerable
,一旦调用
Any()
,你所有的
Where
OrderBy
,以及其他LINQ方法都会触发。我的想法是
p
中的一些东西,你会忽略is
null
。TyCobb你是对的。我知道这是一个愚蠢的错误,但真的看不到,谢谢。如果你把它设置为
IEnumerab,模型就不会为nullle
,但是,一旦你调用
Any()
,你所有的
Where
OrderBy
,以及其他LINQ方法都会被触发。我的想法是
p
中的一些东西,你忽略了is
null
。TyCobb你是对的。我知道这是一个愚蠢的错误,但真的看不到,谢谢。