C# 在cookie中保存多个复选框列表项
我想要的是能够检查我的复选框列表中的4项,并将它们保存在cookie中。每当用户重新打开页面时,cookies就会出现。现在我有了它,它只会选择其中一个复选框作为cookie,如果首先选择第一个复选框,它就会进入cookie。很奇怪,我不明白为什么所有的饼干都不能保存。这是我的代码C# 在cookie中保存多个复选框列表项,c#,asp.net,C#,Asp.net,我想要的是能够检查我的复选框列表中的4项,并将它们保存在cookie中。每当用户重新打开页面时,cookies就会出现。现在我有了它,它只会选择其中一个复选框作为cookie,如果首先选择第一个复选框,它就会进入cookie。很奇怪,我不明白为什么所有的饼干都不能保存。这是我的代码 foreach (ListItem item in CheckBoxList1.Items) { if (item.Selected && Request.Cookies["CBL"] !=
foreach (ListItem item in CheckBoxList1.Items)
{
if (item.Selected && Request.Cookies["CBL"] != null)
{
CheckBoxList1.SelectedValue = Request.Cookies["CBL"].Value;
}
}
然后
protected void Button1_Click(object sender, EventArgs e)
{
Response.Cookies["CBL"].Value = CheckBoxList1.SelectedValue;
Response.Cookies["CBL"].Expires = DateTime.Now.AddDays(30);
}
请有人告诉我我的错误方法。您应该创建一个模型来存储选定的值
public class CheckedItems
{
public bool c1 {get; set;}
public bool c2 {get; set;}
... etc.
}
要从cookie中获取/设置任何对象,可以使用以下函数:
public bool TryGetValueFromCookie<T>(string cookieName, ref T value)
{
HttpCookie cookie = null;
if (Request.Cookies.AllKeys.Any(key => key.Equals(cookieName)))
{
cookie = Request.Cookies.Get(cookieName);
}
if (cookie == null || String.IsNullOrEmpty(cookie.Value))
{
return false;
}
var javaScriptSerializer = new JavaScriptSerializer();
value = javaScriptSerializer.Deserialize<T>(cookie.Value);
return true;
}
public void SetValueToCookie<T>(string name, T value, DateTime expires)
{
var javaScriptSerializer = new JavaScriptSerializer();
var cookie = new HttpCookie(name) { Value = javaScriptSerializer.Serialize(value), Expires = expires };
Request.Cookies.Set(cookie);
}
public bool TryGetValueFromCookie(字符串cookieName,参考T值)
{
HttpCookie=null;
if(Request.Cookies.AllKeys.Any(key=>key.Equals(cookieName)))
{
cookie=Request.Cookies.Get(cookieName);
}
if(cookie==null | | String.IsNullOrEmpty(cookie.Value))
{
返回false;
}
var javaScriptSerializer=新的javaScriptSerializer();
value=javaScriptSerializer.Deserialize(cookie.value);
返回true;
}
public void SetValueToCookie(字符串名称、T值、日期时间过期)
{
var javaScriptSerializer=新的javaScriptSerializer();
var cookie=new-HttpCookie(name){Value=javaScriptSerializer.Serialize(Value),Expires=Expires};
Request.Cookies.Set(cookie);
}
您应该创建一个模型来存储选定的值
public class CheckedItems
{
public bool c1 {get; set;}
public bool c2 {get; set;}
... etc.
}
要从cookie中获取/设置任何对象,可以使用以下函数:
public bool TryGetValueFromCookie<T>(string cookieName, ref T value)
{
HttpCookie cookie = null;
if (Request.Cookies.AllKeys.Any(key => key.Equals(cookieName)))
{
cookie = Request.Cookies.Get(cookieName);
}
if (cookie == null || String.IsNullOrEmpty(cookie.Value))
{
return false;
}
var javaScriptSerializer = new JavaScriptSerializer();
value = javaScriptSerializer.Deserialize<T>(cookie.Value);
return true;
}
public void SetValueToCookie<T>(string name, T value, DateTime expires)
{
var javaScriptSerializer = new JavaScriptSerializer();
var cookie = new HttpCookie(name) { Value = javaScriptSerializer.Serialize(value), Expires = expires };
Request.Cookies.Set(cookie);
}
public bool TryGetValueFromCookie(字符串cookieName,参考T值)
{
HttpCookie=null;
if(Request.Cookies.AllKeys.Any(key=>key.Equals(cookieName)))
{
cookie=Request.Cookies.Get(cookieName);
}
if(cookie==null | | String.IsNullOrEmpty(cookie.Value))
{
返回false;
}
var javaScriptSerializer=新的javaScriptSerializer();
value=javaScriptSerializer.Deserialize(cookie.value);
返回true;
}
public void SetValueToCookie(字符串名称、T值、日期时间过期)
{
var javaScriptSerializer=新的javaScriptSerializer();
var cookie=new-HttpCookie(name){Value=javaScriptSerializer.Serialize(Value),Expires=Expires};
Request.Cookies.Set(cookie);
}
您当前仅在cookie中存储一个值。您需要存储所有选定的值,然后检索所有值。你可以试试下面的方法。管道分隔值:
//chksOne is checkboxlist in the markup.
//CUSTOM DATASOURCE FOR CHECKBOXLIST REPLACE WITH YOUR DATASOURCE
public List<string> Values = new List<string>() { "CHK 1", "CHK 2", "CHK 3", "CHK 4" };
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
return;
chksOne.DataSource = Values;
chksOne.DataBind();
if (Request.Cookies.AllKeys.Contains("CBL"))
{
string value = Request.Cookies["CBL"].Value;
if (value == null)
return;
string[] vals = value.Split('|');
for (int i = 0, ii = chksOne.Items.Count; i < ii; i++)
if (vals.Contains(chksOne.Items[i].Value))
chksOne.Items[i].Selected = true;
}
}
protected void chksOne_SelectedIndexChanged(object sender, EventArgs e)
{
CheckBoxList list = sender as CheckBoxList;
if(list == null)
return;
List<string> tmpValues = new List<string>();
for (int i = 0, ii = list.Items.Count; i < ii; i++)
{
if (list.Items[i].Selected)
tmpValues.Add(list.Items[i].Value);
}
Response.Cookies.Add(new HttpCookie("CBL", string.Join("|", tmpValues.ToArray())));
Response.Cookies["CBL"].Expires = DateTime.Now.AddDays(30);
}
//chksOne是标记中的复选框列表。
//复选框列表的自定义数据源替换为您的数据源
公共列表值=新列表(){“CHK 1”、“CHK 2”、“CHK 3”、“CHK 4”};
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(第IsPostBack页)
返回;
chksOne.DataSource=值;
chksOne.DataBind();
if(Request.Cookies.AllKeys.Contains(“CBL”))
{
字符串值=Request.Cookies[“CBL”].value;
如果(值==null)
返回;
字符串[]VAL=value.Split(“|”);
对于(int i=0,ii=chksOne.Items.Count;i
要使其可重用,您可以创建两个扩展方法:
public static class Extensions
{
public static string GetValues(this CheckBoxList list)
{
List<string> tmpValues = new List<string>();
for (int i = 0, ii = list.Items.Count; i < ii; i++)
{
if (list.Items[i].Selected)
tmpValues.Add(list.Items[i].Value);
}
return string.Join("|", tmpValues.ToArray());
}
public static void SaveValuesToCookie(this CheckBoxList list, string cookieName)
{
string values = list.GetValues();
HttpContext.Current.Response.Cookies.Add(new HttpCookie(cookieName, values));
HttpContext.Current.Response.Cookies[cookieName].Expires = DateTime.Now.AddDays(30);
}
public static void CheckItemsFromCookie(this CheckBoxList list, string cookieName)
{
//MAKE SURE THE COOKIE EXISTS, IF NOT, THERE IS NOTHING WE CAN DO
if (!HttpContext.Current.Request.Cookies.AllKeys.Contains(cookieName))
return;
//MAKE SURE THE COOKIE HAS VALUE AND IT IS NOT NULL
string value = HttpContext.Current.Request.Cookies[cookieName].Value;
if (value == null)
return;
string[] vals = value.Split('|');
for (int i = 0, ii = list.Items.Count; i < ii; i++)
if (vals.Contains(list.Items[i].Value))
list.Items[i].Selected = true;
}
}
公共静态类扩展
{
公共静态字符串GetValues(此复选框列表)
{
List tmpValues=新列表();
对于(int i=0,ii=list.Items.Count;i
那么如何使用代码将是:
public partial class Default : System.Web.UI.Page
{
public List<string> Values = new List<string>() { "CHK 1", "CHK 2", "CHK 3", "CHK 4" };
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
return;
chksOne.DataSource = Values;
chksOne.DataBind();
//EXTENSION METHOD DEFINED ABOVE
chksOne.CheckItemsFromCookie("CBL");
}
protected void chksOne_SelectedIndexChanged(object sender, EventArgs e)
{
CheckBoxList list = sender as CheckBoxList;
if(list == null)
return;
//EXTENSION METHOD DECLARED IN CLASS EXTENSIONS ABOVE
list.SaveValuesToCookie("CBL");
}
}
public部分类默认值:System.Web.UI.Page
{
公共列表值=新列表(){“CHK 1”、“CHK 2”、“CHK 3”、“CHK 4”};
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(第IsPostBack页)
返回;
chksOne.DataSource=值;
chksOne.DataBind();
//上面定义的扩展方法
chksOne.CheckItemsFromCookie(“CBL”);
}
受保护的无效chksOne\u SelectedIndexChanged(对象发送方,事件参数e)
{
CheckBoxList=发件人作为CheckBoxList;
if(list==null)
返回;
//在上面的类扩展中声明的扩展方法
list.SaveValuesToCookie(“CBL”);
}
}
您当前仅在cookie中存储一个值。您需要存储