如何在视图状态下存储通用列表



我需要将泛型列表存储在viewstate中,以便在Postback之后可以使用。代码如下:

private List<guardian> guardianlist(List<guardian> value, string project, string billtype)
{
string head = null, relationstring = null;
SqlCommand cmd1 = new SqlCommand("select accounthead from accountrelation where project = '" + project + "' AND relationfor ='" + billtype + "' and foraccount ='RATE'", agr);
SqlDataReader dr1 = cmd1.ExecuteReader();
while (dr1.Read())
{
SqlCommand cmd = new SqlCommand("select accounthead, relation from accountrelation where project = '" + project + "' AND relationfor ='" + billtype + "' and foraccount ='RATE' ", agr);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
head = dr[0].ToString().Trim();
relationstring = dr[1].ToString().Trim();
string[] multirelationstring = relationstring.Split(new Char[] { '*', '/', '+', '-', '(', ')' });
List<string> buff = new List<string>(multirelationstring);
for (int i = 0; i < multirelationstring.Length; i++)
{
try
{
decimal x = decimal.Parse(multirelationstring[i]);
buff.Remove(multirelationstring[i]);
}
catch
{
if (multirelationstring[i] == "")
{
buff.Remove(multirelationstring[i]);
//multirelationstring = buff.ToArray();
}

}
}
//var v127 =((buff.Where(a => value.All(b => (b.Rate==billtype) && (a != b.Head)))).ToArray()).Length;
if (buff.Where(a => value.All(b => b.Head != a)).Count() == 0)
{
if (((value.Where(a => a.Head == head)).ToArray()).Length == 0)
{
guardian gt = new guardian();
gt.Head = head;
for (int i = 0; i < buff.Count; i++)
{
relationstring = relationstring.Replace(buff[i],value[value.FindIndex(a => a.Head== buff[i])].Relation);
}
gt.Relation = relationstring;
value.Add(gt);
}
}
}
dr.Dispose();
}
dr1.Dispose();
return value;
}
public class guardian
{
public string Head { get; set; }
public string Relation { get; set; }
}

它没有抛出任何异常,但我的";下降13〃;保持空白,而如果我删除";ViewState["listitem1"]=列表项1"它运行良好。

protected void DropDownList16_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList13.ClearSelection();
DropDownList13.Items.Clear();
DropDownList13_SelectedIndexChanged(null, null);
if (DropDownList16.SelectedIndex > 0)
{
List<guardian> listitem1 = new List<guardian>();
if (!DropDownList13.Items.Contains(ListItem.FromString("Select")))
{
DropDownList13.Items.Add("Select");
}
SqlCommand cmd = new SqlCommand("select DISTINCT(accounthead) from accounthead where foraccount='PAYMENT' and not accounthead in (select accounthead from accountrelation where project = '"+DropDownList15.SelectedItem.ToString()+"' and relationfor ='"+DropDownList16.SelectedItem.ToString()+"' and foraccount ='PAYMENT')", agr);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
DropDownList13.Items.Add(dr[0].ToString().Trim());
}
dr.Dispose();
guardian gt = new guardian();
gt.Head = "tsamt";
gt.Relation = "100";
listitem1.Add(gt);
listitem1 = guardianlist(listitem1, DropDownList15.SelectedItem.ToString(), DropDownList16.SelectedItem.ToString().Replace("AMOUNT", "RATE"));

ViewState["listitem1"] = listitem1;
}
}

我在dropdownselectionexchanged和其他一些地方的viewstate中检索到了这个列表。

我的阅读表明ViewState不支持泛型,如果你绝对必须存储这些项,然后使用非泛型ArrayLst,那么在读回时,你必须转换为正确的类型

或者序列化为json,并将该字符串放入视图状态

最新更新