如何检查cookie是否为空

时间:2012-08-24 12:55:19

标签: c# asp.net asp.net-mvc asp.net-mvc-3

我需要检查cookie是否存在值。但我想知道是否有一些快速而好的方法,因为如果我需要检查3个cookie,那么查看iftry似乎很糟糕。

如果cookie不存在,为什么它不会为我的变量分配空字符串?而是显示Object reference not set to an instance of an object.

我的代码(它有效,但对于此任务来说似乎太大了,我认为应该有更好的方法来实现这一点)

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

正如你所看到的,我有这个巨大的块来获取cookie。我想要的是这样的:

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

编辑 也许我可以以某种方式覆盖我喜欢的.Value方法?

1 个答案:

答案 0 :(得分:13)

检查cookie是否为空:

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

注意:“更好”的方法是编写既可读又可靠的优秀代码。它没有分配空字符串,因为这不是C#的工作方式,你试图在Value对象(null)上调用HttpCookie属性 - 你不能使用null对象,因为那里没什么可用的。

转换为int您仍然需要避免解析错误,但您可以使用此内置方法:

int.TryParse(cookieString, out userID);

带来了另一点?为什么要将userID存储在cookie中?这可以由最终用户改变 - 我不知道你打算如何使用它,但我认为这是一个很大的安全漏洞我是正确的吗?


或带有一个辅助函数:

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

...然后

string randomHash = GetCookieValueOrDefault("randomHash");

或使用扩展方法:

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

...然后

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