ArrayList Session 2.0 - 覆盖

时间:2013-09-20 18:31:50

标签: c# asp.net session arraylist

我要做的是将值保留在数组中,直到我在SendEmail()之后清除它。似乎会话数组被覆盖。任何帮助都很棒。

所以我的意思是将另一条记录添加到ArrayList,直到我在SendEmail()例程中清除它。

当然以后我需要删除ArrayList中的重复记录。

这是我的C#2.0代码:

在Login.cs中

public void Page_Load(object sender, EventArgs e)
{
    Session["MyArrayList"] = null;
}

在Share.cs中

public void Page_Load(object sender, EventArgs e)
{
    ArrayList idList = new ArrayList();
    idList.Add(System.IO.Path.GetFileName(FileName));
    Session["MyArrayList"] = idList;                 
}

protected void SendEmail(object sender, EventArgs e)
{
    // To view the Arraylist
    ArrayList idList = (ArrayList)Session["MyArrayList"];

    foreach (string val in idList) 
    { 
        Response.Write(val); 
    }
}

2 个答案:

答案 0 :(得分:2)

首先使用List<T>代替ArrayList

List<string> idList = new List<string>();
idList.Add(System.IO.Path.GetFileName(FileName));

注意:List<T>将提供类型安全性,因此如果您尝试将除string之外的任何内容添加到列表中,则会出现编译错误。

其次,您只需在首次加载页面时更新Session值,而不是在每个帖子上更新,而是执行此操作:

在Login.cs中

public void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        Session["MyArrayList"] = null;
    }
}

在Share.cs中

public void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        ArrayList idList = new ArrayList();
        idList.Add(System.IO.Path.GetFileName(FileName));
        Session["MyArrayList"] = idList;
    }          
}

答案 1 :(得分:0)

由于每次页面加载问题时都需要实际向列表添加内容,因此每次加载时都要实例化一个新的ArrayList。所以东西会被覆盖而不是被添加。这是你真正需要做的事情

Login.cs

public void Page_Load(object sender, EventArgs e)
{
    Session["MyArrayList"] = new ArrayList();
}

Share.cs

public void Page_Load(object sender, EventArgs e)
{
        ArrayList idList = (ArrayList)Session["MyArrayList"];   
        idList.Add(System.IO.Path.GetFileName(FileName));
        Session["MyArrayList"] = idList;                 
}

在登录页面中,我们实例化列表并将其存储在会话中。在另一个页面中,我们从会话中获取先前存储的列表并将其分配给idList并正确投射,然后我们将新内容添加到其中并将其返回到会话中。

注意: 如果会话为空或者不包含ArrayList,则会生成异常。所以你可能需要在代码中加入一个检查机制。