提问人:Ryan B 提问时间:6/10/2014 最后编辑:CommunityRyan B 更新时间:6/11/2014 访问量:114
实例化对象时 ASP.net NullReferenceException
ASP.net NullReferenceException when instantiating an object
问:
我有一个视图,其中包含我从 ViewData 字典中获取的变量。代码如下所示
@{
ParentModel parent = (ParentModel)ViewData["Parent"];
}
我虽然没问题,这是因为该对象在 ViewData 字典中不存在,所以我应该在使用它之前对其进行软强制转换并检查它是否为 null。所以我把它改成了
@{
ParentModel parent = ViewData["Parent"] as ParentModel;
}
但是我仍然在这一行上得到一个空引用异常。所以为了测试一些东西,我把它改成了
@{
ParentModel parent = new ParentModel();
}
它仍然会抛出异常。到底是怎么回事,为什么在视图中实例化对象会引发空引用异常?
更新
我删除了视图顶部未使用的 reverance,resharper 让我知道了,下一个使用引用显示此错误
“没有为扩展 CSHTML 注册生成提供程序”
我认为 ASP.Net 有问题,在网上看,有些人建议在 Web.config 中添加一些东西,但我检查了版本控制,这没有改变,为什么这个问题会开始发生
答:
1赞
Peter
6/10/2014
#1
如果在此行中收到 null 引用异常:
@{
ParentModel parent = ViewData["Parent"] as ParentModel;
}
则 ViewData 本身为 null。在使用 ViewData 之前,必须实例化它。
评论
0赞
Ryan B
6/10/2014
这并不能解释为什么我在我尝试的第三个代码块中也得到了一个空引用异常。它甚至不使用 ViewData,MVC 应该处理这个问题。
0赞
Peter
6/10/2014
是 ParentModel 构造函数中的内容,是您必须存根或模拟的依赖项。构造函数中的代码是什么?
0赞
Ryan B
6/10/2014
它没有显式构造函数,也不继承任何其他类
0赞
Ryan B
6/11/2014
#2
事实证明,这是由于在显示模板视图中使用的模型本身为 null,该模型与从 ViewData 和引发异常的行检索的 Parent 对象完全不同。
我不确定为什么 VS 会在错误的行上中断,但这可能是因为此代码块是模型声明后的第一个列表。例如
@using MyProject.Models
@model ItemModel <---- VS2010 should break here
@{
ItemModel parent = ViewData["Parent"] as ItemModel; <-----VS2010 Breaks here
}
<h2>@Model.Title</h2>
评论