检查空值时出现空错误

时间:2016-07-07 10:07:04

标签: asp.net-mvc vb.net razor session-variables nullreferenceexception

我在尝试使用会话变量执行某些操作之前尝试测试值。 这是用于初始化(如您所见会话(" Chemin")是字符串列表

        @If (IsDBNull(Session("Chemin")) Or (ViewContext.RouteData.Values("action") = "Index")) Then
        @Code Dim lst As New List(Of String)()
        Session("Chemin") = lst  // Initialisation
     End Code
End If

但问题在于测试:

@If (Not IsDBNull(ViewContext.RouteData.Values("action")) AndAlso Not IsDBNull(Session("Chemin")) AndAlso Not Session("Chemin").Contains((ViewContext.RouteData.Values("action").ToString()))) Then

我有时会得到

  

System.NullReferenceException

我不明白,因为我只是在测试它,但它却给我一个错误。 所以我的问题是:为什么以及何时会发生这种情况?如何解决这个问题? 编辑:不是重复,因为不是简单的System.NullReferenceException

2 个答案:

答案 0 :(得分:1)

您应该将所有IsDBNull替换为IsNothing,这就是您要查找的内容。因为我认为你的

    @If (IsDBNull(Session("Chemin"))

无法通过,因此会话(“Chemin”)可能没什么。

您应该检查ViewContextViewContext.RouteDataViewContext.RouteData.ValuesViewContext.RouteData.Values("action")并非万一。

你可以这样做:

                                                @Code Dim values = ViewContext?.RouteData?.Values End Code
                                        @If (values IsNot Nothing) // And the rest of your tests

答案 1 :(得分:0)

首先: DbNull与null(在VB slang中为Nothing)不同。因此,如果您将此方法调用IsDbNull(),则应检查该方法是否崩溃:IsDbNull(Nothing)。 我是这么认为的,但我不确定。如果是这样,请添加额外的空检查,并且您很好。

如果问题仍然存在,请深入探讨:

表达式如ViewContext.RouteData.Values("action"),链中的所有属性都可以为null。这意味着如果ViewContextRouteData甚至Values为空,则会抛出此异常。

Session本身也是如此:它是一种值容器,您可以检查该容器中给定键的值是否为空。但是如果Session本身为空呢?这同样适用于Values属性。

基本上这会转化为null.ElementAt("Chemin")。这将在周围的IsDbNull()被调用之前崩溃。

所以你可以这样检查:

Session Is Nothing OrElse IsDBNull(Session("Chemin"))
' note: you might want to check if the session contains the key before getting a value with it

Dim values = ViewContext?.RouteData?.Values ' see "Elvis Operator" for the question marks
If (values IsNot Nothing AndAlso values("action") = "Index") Then