C# 生产中任何无法在本地复制的方法的NullReferenceException
当我浏览我们的MVC4网站时,除其他外,该网站可用于制定时间表,并转到/时间表,我看到错误消息: System.NullReferenceException:对象引用未设置为实例 指一个物体。(……) 堆栈跟踪: [NullReferenceException:对象引用未设置为 对象。]C# 生产中任何无法在本地复制的方法的NullReferenceException,c#,linq,asp.net-mvc-4,nullreferenceexception,C#,Linq,Asp.net Mvc 4,Nullreferenceexception,当我浏览我们的MVC4网站时,除其他外,该网站可用于制定时间表,并转到/时间表,我看到错误消息: System.NullReferenceException:对象引用未设置为实例 指一个物体。(……) 堆栈跟踪: [NullReferenceException:对象引用未设置为 对象。] ASP.\页面\视图\时间表\索引\ cshtml.b\ 5(时间表s)+54 System.Linq.Enumerable.Any(IEnumerable1源,Func2谓词) +146 ASP.\页面\视图
ASP.\页面\视图\时间表\索引\ cshtml.b\ 5(时间表s)+54
System.Linq.Enumerable.Any(IEnumerable
1源,Func
2谓词)
+146 ASP.\页面\视图\时间表\索引\ cshtml.Execute()+4057 System.Web.WebPages.WebPageBase.ExecutePageHierarchy()+198System.Web.Mvc.WebViewPage.ExecutePageHierarchy()+104
System.Web.WebPages.StartPage.RunPage()+17
System.Web.WebPages.StartPage.ExecutePageHierarchy()+64(…) 这是不可取的。不幸的是,我无法在生产环境中将编译模式置于调试状态,并且在本地无法再现错误。我很想把它修好,我希望这里有人能帮我。我将尝试解决这个问题,并希望您愿意考虑: 查看上面的堆栈跟踪,我看到一个
Any()
调用,在timeline/Index.cshtml
上只有两个Any()
调用,在控制器中只有一个
我们有一个计划和一个提议模型:(计划用于存储日期、用户和状态,如果用户希望更改与其他用户的日期,则使用该提议)
我在本地看到的是,这个方法总是返回一个空列表,但不是null
。(它能否返回null
?)
还有一个TimetableController
,有一种方法:
[HttpGet]
public ActionResult Index()
{
var dates = Schedule.GetCorveeDatesNextThirtyDays(); // returns dates that are not weekends
var schedulesNextThirtyDays = db.Schedules.Where(s =>
dates.Contains(s.Date)).ToList();
var schedules = schedulesNextThirtyDays.Where(s => s.State ==
ScheduleState.Active).ToList();
if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date))) //Any in controller
{
var todays_schedule = schedulesNextThirtyDays.Where(s => s.State ==
ScheduleState.Completed).FirstOrDefault(s => dates.Contains(s.Date));
if(todays_schedule != null)
schedules.Add(todays_schedule);
}
return View(new DatesAndSchedulesViewModel(dates, schedules));
}
其中,Dates和schedulesviewmodel
由构造函数中设置的i收集计划
和i收集日期
组成
在时间表视图中,日期和schedulesviewmodel
作为模型
我们有以下发生在时间表之后的代码!=空
检查:
@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name))) //First Any() on view
{
if (schedule.State == ScheduleState.Active)
{
if (schedule.GetActiveAssociatedProposals().Any()) //Second Any() on view
{
<span>Do something</span>
}
}
}
@if(Model.Schedules.Any(s=>s.User.Name.Equals(User.Identity.Name))//视图中的第一个Any()
{
if(schedule.State==ScheduleState.Active)
{
if(schedule.getActiveAssociatedPropositions().Any())//视图中的第二个Any()
{
做点什么
}
}
}
我知道Linq的Any()
如果在null
上执行,则会引发NullReferenceException。我想知道的是时间表
视图上的schedule.getActiveAssociatedPropositions()
是否可能返回null
,从而引发上述异常?或者控制器中的(!schedules.Any(s=>s.Date.Equals(DateTime.Now.Date))是否可以检查null
如果是这样,在执行检查之前,可以通过检查某些属性是否为
null
来解决问题。我希望有人能告诉我是否确实如此,并让我开始了解如何实现null
-检查 Any可以返回null,但在本例中,抛出null的是lambda
从stacktrace中:
ASP._Page_Views_Timetable_Index_cshtml.b__5(Schedule s) +54
b_uu5
表示由Any
中使用的lambda创建的内部类
if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date)))
我的猜测是s
为null,因此列表不是空的,而是包含null元素
编辑:Oops,错误Any
@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name)))
这更有意义
User
可以为null,或者Name
可以为null。任何人都可以返回null,但在这种情况下,抛出null的是lambda
从stacktrace中:
ASP._Page_Views_Timetable_Index_cshtml.b__5(Schedule s) +54
b_uu5
表示由Any
中使用的lambda创建的内部类
if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date)))
我的猜测是s
为null,因此列表不是空的,而是包含null元素
编辑:Oops,错误Any
@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name)))
这更有意义
User
可以为null,或者Name
可以为null。任何人都可以返回null,但在这种情况下,抛出null的是lambda
从stacktrace中:
ASP._Page_Views_Timetable_Index_cshtml.b__5(Schedule s) +54
b_uu5
表示由Any
中使用的lambda创建的内部类
if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date)))
我的猜测是s
为null,因此列表不是空的,而是包含null元素
编辑:Oops,错误Any
@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name)))
这更有意义
User
可以为null,或者Name
可以为null。任何人都可以返回null,但在这种情况下,抛出null的是lambda
从stacktrace中:
ASP._Page_Views_Timetable_Index_cshtml.b__5(Schedule s) +54
b_uu5
表示由Any
中使用的lambda创建的内部类
if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date)))
我的猜测是s
为null,因此列表不是空的,而是包含null元素
编辑:Oops,错误Any
@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name)))
这更有意义
User
可以为空,或者Name
可以为空。b_5
表示内部类。:-)哇,你怎么知道你不介意我问?问过这个问题后,Schedules
表不允许所有列都为空,因此我不理解db.Schedules.Where(s=>dates.Contains(s.Date)).ToList()是如何工作的
可能包含空元素?而且Schedule
的UserId
和User
的Name
不能为空。@user2609980我只识别C编译器用于lambda的名称。双下划线是个好符号。对s
执行空检查是否有帮助?就像在@if(Model.Schedules.Any(s=>s.User!=null&&s.User.Name!=null&&s.User.Name.Equals(User.Identity.Name))
?@user2609980是的,这是一种情况,我只是开始在可疑区域设置空保护,希望能够解决问题。b_5
表示一个内部类。:-)哇,你怎么知道你不知道