2

Ich versuche Werte zu testen, bevor ich einige Aktionen mit Sitzungsvariablen ausführe. Diese ist für die Initialisierung (Wie Sie Session sehen ("Chemin") ist eine Liste der String:Null Fehler beim Überprüfen des Nullwerts

 @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 

Aber das Problem ist mit dem Test hier:

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

ich manchmal

System.NullReferenceException

Ich verstehe das nicht, weil ich es gerade teste, und doch wirft es mir einen Fehler zu. Also meine Frage ist: Warum und wann passiert es genau? Wie behebe ich das? Edit: kein Duplikat, weil keine einfach System.NullReferenceException

+0

versuchen, es zu 'ViewContext.HttpContext.Request.QueryString.Get Wechsel ("action");' –

+0

ToString nicht System.DBNull zurückkehren kann, die ist Woran IsDbNull es vergleicht, Ihre Bewertung wird immer falsch zurückgeben. – Esko

+0

Esko, Es ist das gleiche ohne ToString Ich habe es dort, weil ich verzweifelt war, ich benutzte es später. Ich stimme zu, es war dumm –

Antwort

1

Sie ersetzen sollten alle Ihre IsDBNull mit IsNothing, das ist, was Sie in diesem Fall suchen. Weil ich denke, Ihr

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

konnte nicht übergeben und so die Sitzung ("Chemin") könnte nichts sein.

Sie sollten überprüfen, dass ViewContext, ViewContext.RouteData, ViewContext.RouteData.Values und ViewContext.RouteData.Values("action") sind nichts, nur für den Fall.

Sie können es mit diesem tun:

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

Erstens: DBNULL nicht die gleichen wie null ist (die Nothing in VB Slang). Sie sollten also prüfen, ob diese Methode IsDbNull() abstürzt, wenn Sie es so nennen: IsDbNull(Nothing). Ich denke schon, aber ich bin mir nicht sicher. Wenn ja, fügen Sie diesen zusätzlichen Null-Check hinzu und Sie sind gut.

Wenn das Problem immer noch vorhanden ist, läßt dive deeper:

Ist ein Ausdruck wie ViewContext.RouteData.Values("action") alle Eigenschaften in der Kette null sein könnten. Das heißt, wenn ViewContext, RouteData oder sogar Values null sind, wird diese Ausnahme ausgelöst.

Das gleiche für die Session selbst: Es ist eine Art Wert Container und Sie überprüfen, ob ein Wert bei einem gegebenen Schlüssel in diesem Container ist Null. Aber was, wenn die Session selbst null ist? Gleiches gilt für die Eigenschaft Values.

Grundsätzlich würde dies zu null.ElementAt("Chemin") übersetzen. Und das wird abstürzen, bevor die umgebende IsDbNull() aufgerufen wird.

So können Sie wie folgt überprüfen:

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 

Und

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

Wenn Session null ist, wie kann ich es aufheben? Kann Session null sein? Und der Fehler ist auf dem zweiten Test also warum sollte es die erste und nicht die zweite passieren? –

+0

Wenn der erste Test in Ordnung ist, dann ist Ihre 'Session' Eigenschaft nicht null. In diesem Fall können Sie sich auf den zweiten Test konzentrieren und die Eigenschaft Kette auf Nullen überprüfen - das ist ziemlich grundlegende Sachen, die ich hier nicht erklären werde. – Waescher