检查空值时为空错误
我正在尝试使用会话变量执行某些操作之前测试值。 这是用于初始化(正如你可以看到会议(“舍曼”)是字符串的列表:检查空值时为空错误
@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
就应该替换所有的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
第一:的DBNull是不一样的空(这是在VB俚语Nothing
)。所以你应该检查这个方法IsDbNull()
是否崩溃,如果你这样称呼它:IsDbNull(Nothing)
。 我这么认为,但我不确定。如果是这样,添加额外的空检查,你很好。
如果问题仍然存在,让下潜更深:
是像ViewContext.RouteData.Values("action")
表达链中的所有属性可能为空。这意味着如果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
如果会话为空我该如何取消它null?会话可以为空吗?顺便说一句,错误是在第二个那么为什么它会通过第一个而不是第二个呢? –
如果第一个测试没问题,那么你的'Session'属性不是null。在这种情况下,你可以关注第二个测试并检查属性链的空值 - 这是非常基本的东西,我不会在这里解释。 – Waescher
尝试将其更改为 'ViewContext.HttpContext.Request.QueryString.Get( “行动”);' –
的ToString不能返回System.DbNull这是什么IsDbNull比较它,你的评估总是会返回false。 – Esko
Esko,没有ToString,这是一样的,我把它放在那里,因为我很绝望,以后我会用它。我同意这是愚蠢的 –