Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查Cookie是否为空_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# 如何检查Cookie是否为空

C# 如何检查Cookie是否为空,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,我需要检查cookie是否有值。但是我想知道是否有一些快速而好的方法,因为如果我需要检查3个cookies,那么使用if或try检查似乎不好 如果cookie不存在,为什么它不将空字符串分配给我的变量?相反,它显示未设置为对象实例的对象引用。 我的代码(它可以工作,但对于这个任务来说似乎太大了,我认为应该有更好的方法来完成) 正如你所看到的,我有这么大的积木只是为了得到饼干。我想要的是这样的: // Gives value on success, null on cookie that is n

我需要检查cookie是否有值。但是我想知道是否有一些快速而好的方法,因为如果我需要检查3个cookies,那么使用
if
try
检查似乎不好

如果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
方法?

只要检查cookie是否为空:

if(Request.Cookies["randomHash"] != null)
{
   //do something
}
注意:“更好”的方法是编写可读性和可靠性都很好的代码。它不会分配空字符串,因为这不是C的工作方式,您试图调用
null
对象(
HttpCookie
)上的
Value
属性-您不能使用null对象,因为没有什么可使用的

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

int.TryParse(cookieString, out userID);
这引出了另一点?为什么要将用户标识存储在cookie中?这可以由最终用户更改-我不知道您打算如何使用它,但我是否正确地假设这是一个很大的安全漏洞


或者使用一些辅助功能:

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

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

或使用扩展方法:

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

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

也许这并不理想,但这段代码并没有什么“巨大”的地方,不过我还是希望使用第二段代码。如果这是唯一可行的方法,但我觉得应该有更好的方法。好的,您可以使用类似于
Convert.ToString(Request.Cookies[“randomHash”!=null?Request.Cookies[“randomHash”]。值:)每行,但这只会给出更长的行。@Mr.Occession,这就是我要找的。提交答案,我会接受的。你们怎么了!(或者只是我?)但你们为什么要明确地将
字符串
转换为
字符串
@失望先生:你有13K代表!!!对您的其他优秀答案的一个更正-int.TryParse不使用try/catch。出于效率原因,它避免了尝试/捕获。这就是为什么使用TryParse方法总比用try/catch块包装好。