检查空值时为空错误

问题描述:

我正在尝试使用会话变量执行某些操作之前测试值。 这是用于初始化(正如你可以看到会议(“舍曼”)是字符串的列表:检查空值时为空错误

 @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

尝试将其更改为 'ViewContext.HttpContext.Request.QueryString.Get( “行动”);' –

+0

的ToString不能返回System.DbNull这是什么IsDbNull比较它,你的评估总是会返回false。 – Esko

+0

Esko,没有ToString,这是一样的,我把它放在那里,因为我很绝望,以后我会用它。我同意这是愚蠢的 –

就应该替换所有的IsDBNullIsNothing,那是你在找什么在这种情况下。因为我认为你的

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

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

你应该检查一下ViewContext,ViewContext.RouteData,ViewContext.RouteData.ValuesViewContext.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 
+0

如果会话为空我该如何取消它null?会话可以为空吗?顺便说一句,错误是在第二个那么为什么它会通过第一个而不是第二个呢? –

+0

如果第一个测试没问题,那么你的'Session'属性不是null。在这种情况下,你可以关注第二个测试并检查属性链的空值 - 这是非常基本的东西,我不会在这里解释。 – Waescher