2012-08-24 23 views
9

Ich muss überprüfen, ob ein Cookie mit Wert vorhanden ist oder nicht. Aber ich frage mich, ob es eine schnelle und gute Möglichkeit gibt, dies zu tun, denn wenn ich 3 Cookies überprüfen muss, scheint es schlecht zu sein mit if oder try zu überprüfen.Wie überprüft man, ob Cookies leer sind oder nicht

Warum wird meiner Variablen kein leerer String zugewiesen, wenn kein Cookie vorhanden ist? Stattdessen zeigt es Object reference not set to an instance of an object.

Mein Code (es funktioniert, aber es scheint zu groß für diese Aufgabe, ich glaube, es sollte einen besseren Weg, dies zu tun)

// First I need to asign empty variables and I don't like this 
string randomHash = string.Empty; 
string browserHash = string.Empty; 
int userID = 0; 

// Second I need to add this huge block of try/catch just to get cookies 
// It's fine since I need all three values in this example so if one fails all fails 
try 
{ 
    randomHash = Convert.ToString(Request.Cookies["randomHash"].Value); 
    browserHash = Convert.ToString(Request.Cookies["browserHash"].Value); 
    userID = Convert.ToInt32(Request.Cookies["userID"].Value); 
} 
catch 
{ 
    // And of course there is nothing to catch here 
} 

Wie man sehen kann ich diese riesige haben blockieren, nur um Cookies zu erhalten. Was ich möchte, ist so etwas wie dieses:

// Gives value on success, null on cookie that is not found 
string randomHash = Convert.ToString(Request.Cookies["randomHash"].Value); 
string browserHash = Convert.ToString(Request.Cookies["browserHash"].Value); 
int userID = Convert.ToInt32(Request.Cookies["userID"].Value); 

bearbeiten Vielleicht die .Value Methode nach meinem Geschmack Ich kann irgendwie außer Kraft setzen?

+0

Vielleicht ist das nicht ideal, aber es gibt wirklich nichts "Riesiges" an diesem Block Code. –

+0

Noch würde ich gerne den zweiten verwenden. Wenn das der einzige Weg ist, aber es scheint mir nur, dass es einen besseren geben sollte. – sed

+1

Okay, Sie könnten etwas wie 'Convert.ToString (Request.Cookies [" randomHash "]! = Null? Request.Cookies [" randomHash "]. Value:" ");' pro Zeile, aber das gibt nur längere Zeilen . –

Antwort

11

überprüfen Sie einfach, ob das Cookie ist null:

if(Request.Cookies["randomHash"] != null) 
{ 
    //do something 
} 

HINWEIS: Der „Better“ Weg, dies zu tun, ist gut, Code zu schreiben, die sowohl lesbar und zuverlässig ist. Es wird keine leere Zeichenfolge zugewiesen, da C# nicht funktioniert. Sie versuchen, die Value-Eigenschaft auf einem null-Objekt (HttpCookie) aufzurufen - Sie können keine Nullobjekte verwenden, da nichts zu verwenden ist.

Konvertierung in ein int Sie noch Parse-Fehler zu vermeiden, müssen, aber Sie können dies in der Methode gebaut verwenden:

int.TryParse(cookieString, out userID); 

, die auf einen anderen Punkt bringt? Warum speichern Sie die Benutzer-ID in einem Cookie? Dies kann vom Endbenutzer geändert werden - ich weiß nicht, wie Sie dies verwenden wollen, aber würde ich richtigerweise davon ausgehen, dass dies ein großes Sicherheitsloch ist?


oder mit einer kleinen Funktion Helfer:

public string GetCookieValueOrDefault(string cookieName) 
{ 
    HttpCookie cookie = Request.Cookies[cookieName]; 
    if(cookie == null) 
    { 
     return ""; 
    } 
    return cookie.Value; 
} 

dann ...

string randomHash = GetCookieValueOrDefault("randomHash"); 

Oder mit einer Erweiterungsmethode:

public static string GetValueOrDefault(this HttpCookie cookie) 
{ 
    if(cookie == null) 
    { 
     return ""; 
    } 
    return cookie.Value; 
} 

dann ...

string randomHash = Request.Cookies["randomHash"].GetValueOrDefault(); 
+2

Eine Korrektur für Ihre ansonsten gute Antwort - int.TryParse verwendet try/catch nicht. Es vermeidet den Versuch/Fang aus Effizienzgründen. Aus diesem Grund ist es immer besser, die TryParse-Methoden zu verwenden, anstatt sie in einen try/catch-Block zu packen. – MgSam

Verwandte Themen