2012-08-24 15 views
9

Ho bisogno di controllare se il cookie è presente con valore o meno. Ma mi chiedo se c'è un modo rapido e valido per farlo, dal momento che se devo controllare 3 cookie, mi sembra male controllare con if o try.Come verificare se i cookies sono vuoti o meno

Perché non assegna una stringa vuota alla mia variabile se il cookie non è presente? Invece mostra Object reference not set to an instance of an object.

Il mio codice (che funziona, ma sembra troppo grande per questo compito, penso che ci dovrebbe essere un modo migliore di fare questo)

// 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 
} 

Come potete vedere ho questo enorme bloccare solo per ottenere i cookie. Quello che vorrei è qualcosa di simile:

// 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); 

Edit Forse posso in qualche modo l'override del metodo .Value di mio gradimento?

+0

Forse questo non è ideale, ma non c'è davvero nulla di "enorme" in questo blocco di codice. –

+0

Ancora mi piacerebbe usare il secondo. Se questo è l'unico modo che va bene, ma mi sembra che ce ne dovrebbe essere uno migliore. – sed

+1

Ok, potresti usare qualcosa come 'Convert.ToString (Request.Cookies [" randomHash "]! = Null? Request.Cookies [" randomHash "]. Valore:" ");' per riga, ma che dà solo linee più lunghe . –

risposta

11

Basta controllare se il cookie è nullo:

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

NOTA: Il modo "migliore" di fare questo è quello di scrivere buon codice che sia leggibile e affidabile. Non assegna una stringa vuota perché non è così che funziona C#, stai provando a chiamare la proprietà Value su un oggetto null (HttpCookie) - non puoi usare oggetti nulli perché non c'è nulla da usare.

Conversione in un int è comunque necessario per evitare errori di analisi, ma è possibile utilizzare questo costruito nel metodo:

int.TryParse(cookieString, out userID); 

che porta su un altro punto? Perché stai memorizzando l'ID utente in un cookie? questo può essere modificato dall'utente finale - Non so come pensi di usarlo, ma avrei ragione ad ipotizzare che questo sia un grosso buco di sicurezza?


o con un po 'di funzione di supporto:

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

poi ...

string randomHash = GetCookieValueOrDefault("randomHash"); 

O con un metodo di estensione:

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

quindi ...

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

Una correzione per la tua risposta altrimenti ottima - int.TryParse non usa try/catch. Evita il tentativo/cattura per motivi di efficienza. Questo è il motivo per cui ** è sempre ** meglio usare i metodi TryParse piuttosto che eseguire il wrapping in un blocco try/catch. – MgSam

Problemi correlati