如果您想设置一个包含多个值或“子键”的 cookie 并让它们从 .NET 中读取,您需要将子键存储为名称-值对,格式类似于查询字符串。您可以使用 jQuery.param() 方法将 Javascript 对象转换为查询字符串。
var obj = { email: 'jdoe@example.com', username: 'jdoe' };
$.cookie("MyTestCookie", $.param(obj), { expires: 10 });
然后在服务器上,您可以访问这些值:
var email = Request.Cookies["MyTestCookie"]["email"];
var username = Request.Cookies["MyTestCookie"]["username"];
编辑:我创建了一个测试页面来显示在服务器和客户端上读取/写入多值 cookie。 http://www.systemex.net/Cookies/
注意事项:
- 您需要注意转义和取消转义子项。这样,任何嵌入的 = 和 & 都可以正确处理
- 读取和写入 jquery cookie 时,请使用选项 { raw: true },以免双重转义。
- 我编写了一个 $.deparam 函数,它将 name=value&name2=value2 字符串转换为 javascript 对象 { name: value, name2: value2 }
- 最后一件事,jquery cookie 插件不会覆盖同名的 cookie,它只是将其附加到当前的 cookie 集合中。此时,最好重写插件以支持子键和修改现有 cookie。
无论如何希望这会有所帮助。
这里是 Default.aspx
<h1>Get Cookie From Server:</h1>
<ul>
<li>Email: <%= GetCookie("MyTestCookie", "email")%></li>
<li>Username: <%= GetCookie("MyTestCookie", "username")%></li>
</ul>
<h1>Get Cookie From Client:</h1>
<ul>
<li>Email: <span class="cookie" data-name="MyTestCookie" data-key="email" /></li>
<li>Username: <span class="cookie" data-name="MyTestCookie" data-key="username" /></li>
<li>Raw: <span id="raw" /></li>
</ul>
<h1>Set Cookie From Client:</h1>
<ul>
<li>Email: <input type="text" name="email" value="" /></li>
<li>Username: <input type="text" name="username" value="" /></li>
</ul>
<input type="submit" value="Submit" />
<script>
$(function () {
$(".cookie").each(function (index) {
var name = $(this).data('name');
var key = $(this).data('key');
var cookie = $.deparam($.cookie(name, { raw: true }));
$(this).html(cookie[key]);
});
$('#raw').text(escape($.cookie("MyTestCookie"), { raw: true }));
$("form").submit(function () {
var o = {};
o.email = $('input[name=email]').val();
o.username = $('input[name=username]').val();
var value = $.param(o);
var cookie = $.cookie('MyTestCookie', value, { raw: true });
return true;
});
});
jQuery.deparam = function (params) {
var o = {};
if (!params) return o;
var a = params.split('&');
for (var i = 0; i < a.length; i++) {
var pair = a[i].split('=');
o[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
}
return o;
}
</script>
默认.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
var cookie = new HttpCookie("MyTestCookie");
cookie["email"] = HttpUtility.UrlEncode("jdoe@example.com");
cookie["username"] = HttpUtility.UrlEncode("jdoe&123");
Response.Cookies.Add(cookie);
}
}
public string GetCookie(string name, string key)
{
var cookie = Request.Cookies[name];
return cookie != null ? HttpUtility.UrlDecode(cookie[key]) : "";
}