C# 如何检查Cookie是否为空
我需要检查cookie是否有值。但是我想知道是否有一些快速而好的方法,因为如果我需要检查3个cookies,那么使用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
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块包装好。