2012-08-24 12 views
9

Necesito comprobar si la cookie está presente con valor o no. Pero me pregunto si hay alguna forma rápida y buena de hacerlo, ya que si necesito verificar 3 cookies parece malo verificar con if o try.Cómo comprobar si las cookies están vacías o no

¿Por qué no asigna cadena vacía a mi variable si la cookie no está presente? En su lugar, muestra Object reference not set to an instance of an object.

Mi código (que funciona, pero parece demasiado grande para esta tarea, yo creo que debe haber una mejor manera de hacer esto)

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

Como se puede ver que tengo esta enorme bloquear solo para obtener cookies. Lo que me gustaría es algo como esto:

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

Editar Tal vez pueda de alguna manera reemplazar el método .Value a mi gusto?

+0

Quizás esto no es ideal, pero realmente no hay nada "grande" sobre ese bloque de código. –

+0

Todavía me gustaría usar el segundo. Si esta es la única manera de hacerlo bien, pero me parece que debería haber una mejor. – sed

+1

Bien, podrías usar algo como 'Convert.ToString (Request.Cookies [" randomHash "]! = Null? Request.Cookies [" randomHash "]. Valor:" ");' por línea, pero eso solo da líneas más largas . –

Respuesta

11

Sólo comprobar si la cookie es nulo:

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

NOTA: El "mejor" forma de hacer esto es escribir buen código que sea legible y fiable. No asigna cadena vacía porque no es así como funciona C#, está intentando llamar a la propiedad Value en un objeto null (HttpCookie) - no puede usar objetos nulos porque no hay nada que usar.

Conversión a un int que aún necesita para evitar errores de análisis, pero se puede utilizar este método construido en:

int.TryParse(cookieString, out userID); 

que trae en otro momento? ¿Por qué está almacenando el ID de usuario en una cookie? esto puede ser cambiado por el usuario final: no sé cómo planea usar esto, pero ¿estaría bien suponer que este es un gran agujero de seguridad?


o con un poco de función auxiliar:

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

entonces ...

string randomHash = GetCookieValueOrDefault("randomHash"); 

O con un método de extensión:

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

luego ...

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

Una corrección a su respuesta, por lo demás excelente: int.TryParse no usa try/catch. Evita el try/catch por razones de eficiencia. Es por eso que ** siempre ** es mejor usar los métodos TryParse en lugar de envolver en un bloque try/catch. – MgSam

Cuestiones relacionadas