我在尝试使用会话变量执行某些操作之前尝试测试值。 这是用于初始化(如您所见会话(" 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
答案 0 :(得分:1)
您应该将所有IsDBNull
替换为IsNothing
,这就是您要查找的内容。因为我认为你的
@If (IsDBNull(Session("Chemin"))
无法通过,因此会话(“Chemin”)可能没什么。
您应该检查ViewContext
,ViewContext.RouteData
,ViewContext.RouteData.Values
和ViewContext.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。这意味着如果ViewContext
,RouteData
甚至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