System.Web.Mvc.dll 中的“System.NullReferenceException”正在减慢页面加载速度 [重复]

"System.NullReferenceException' in System.Web.Mvc.dll" is slowing down page load [duplicate]

提问人:Trinitrotoluene 提问时间:2/1/2016 最后编辑:Alexei LevenkovTrinitrotoluene 更新时间:2/1/2016 访问量:2888

问:

我知道为什么会发生这种情况,我正在我的模型中寻找一个可能存在也可能不存在的属性,如果它在那里,它会生成一些 HTML,如果不是,它会生成不同的 HTML,所以我不得不将其包装在 try catch 中(在 foreach 的中间:

@try
{
    if (item.tbl_computerinfo.FirstOrDefault().teamviewerID != null)
    {
        <td class="text-center"><a href="javascript:TeamviewerConnect(@Html.DisplayFor(modelItem => item.tbl_computerinfo.FirstOrDefault().teamviewerID)"><img src="~/Content/images/icons/teamviewericon.png" alt='TeamviewerID' border='0' title='@Html.DisplayFor(modelItem => item.tbl_computerinfo.FirstOrDefault().teamviewerID)'></a></td>
    }
}
catch (Exception)
{
    <td></td>
}

随后,这将生成数百个:

Exception thrown: 'System.NullReferenceException' in System.Web.Mvc.dll

在输出中。这大大减慢了页面的速度。有没有更好的方法来处理不会减慢页面速度的空引用异常?

C# asp.net asp.net-mvc-4 nullreferenceexception

评论

0赞 Wiktor Zychla 2/1/2016
您确定 firstordefault 有时不只是返回 null 吗?
0赞 Drew Kennedy 2/1/2016
try-catch在剃刀中。咩。考虑将其移至控制器。

答:

1赞 Kristoffer Jälén 2/1/2016 #1

你说你知道该物业可能不在那里,那么只是检查该物业?

if (item != null)

或者您指的是哪个属性。

2赞 Lathejockey81 2/1/2016 #2

在检查 之前检查 null。如果您使用的是 C#6,请添加 ?在 FirstOrDefault() 之后。null 检查比引发异常要快得多。FirstOrDefault()teamviewerID

非 C#6:

var myItem = item.tbl_computerinfo.FirstOrDefault();
if (myItem != null && myItem.teamviewerID != null)
{
    <td class="text-center"><a href="javascript:TeamviewerConnect(@Html.DisplayFor(modelItem => item.tbl_computerinfo.FirstOrDefault().teamviewerID)"><img src="~/Content/images/icons/teamviewericon.png" alt='TeamviewerID' border='0' title='@Html.DisplayFor(modelItem => item.tbl_computerinfo.FirstOrDefault().teamviewerID)'></a></td>
}
else
{
    <td></td>
}

C#6:

if (item.tbl_computerinfo.FirstOrDefault()?.teamviewerID != null)
{
    <td class="text-center"><a href="javascript:TeamviewerConnect(@Html.DisplayFor(modelItem => item.tbl_computerinfo.FirstOrDefault().teamviewerID)"><img src="~/Content/images/icons/teamviewericon.png" alt='TeamviewerID' border='0' title='@Html.DisplayFor(modelItem => item.tbl_computerinfo.FirstOrDefault().teamviewerID)'></a></td>
}
else
{
    <td></td>
}

评论

0赞 Trinitrotoluene 2/1/2016
这奏效了 - 谢谢。尽管我在 VS 2015 中,但我什至没有使用 C#6。谢谢。通过在项目的高级生成属性中面向 C#6 并运行 Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform 来解决此问题
1赞 romanoza 2/1/2016 #3

只需检查 null:

Computerinfo i = item.tbl_computerinfo.FirstOrDefault();
if(i != null) {
    ...
}