使用Session在多个Postback之间传递动态控制的状态

时间:2012-12-10 13:59:10

标签: c#

我是编程新手并遇到问题。我在aspx页面上有两个按钮。 这两个按钮都具有runat="server"属性,位于<form runat="server" >标记

aspx代码

<form id="form1" runat="server">
<asp:Button ID="btnGetData"  runat="server" onclick="btnGetData_Click" />
<asp:Button ID="btnShow" Text="Send" runat="server" onclick="btnShow_Click" />
</form>

btnGetData

 protected void btnGetData_Click(object sender, EventArgs e)
 {
            headlines = masg.Split('*');
            //Response.Write(headlines.Length);
            cb = new CheckBox[headlines.Length];

            for (int i = 0; i < headlines.Length; i++)
            {
                cb[i] = new CheckBox();

                cb[i].Text = headlines[i];
                Literal br = new Literal();
                br.Text = "<br/>";
                Form.Controls.Add(cb[i]);
                Form.Controls.Add(br);
            }

 }     

单击“获取数据”按钮,将生成多个带有关联文本的复选框。

我点击了一些复选框,然后点击显示按钮如果工作正确应将选定的checboxes文本组合成单个字符串并显示它。

btnShow

protected void btnShow_Click(object sender, EventArgs e)
{



            for (int i = 0; i < headlines.Length; i++)
            {
                if (cb[i].Checked)
                    newmsg += cb[i].Text + '*';
            }
            Response.Write("<BR><BR><BR>" + newmsg);

}

但是一旦我点击GetData按钮,复选框就会丢失,因为它们不会持久存在,因为HTTP是无规则的。我读到了有关Viewstate的信息,但是当涉及大量数据时不建议这样做会导致显着的处理延迟。

替代方法是使用会话。这里有IsPostBack页面属性吗?

请指导如何实施Session以从一个按钮(GetData)点击其他即显示按钮传递所选复选框。

1 个答案:

答案 0 :(得分:1)

您遇到的是一个相当常见的问题,因此我建议您使用转发器。例如:

<asp:Repeater id="rptCheckboxes" runat="server">
<ItemTemplate>
  <asp:CheckBox ID="cbxMessage" runat="server" Text="<%# Container.DataItem %>" />
  <br />
</ItemTemplate>

</asp:Repeater>

在代码中:

protected void btnGetData_Click(object sender, EventArgs e)
{
   headlines = masg.Split('*');
   rptCheckboxes.DataSource = headlines;
   rptCheckboxes.DataBind();
}     

protected void btnShow_Click(object sender, EventArgs e)
{
   string newmsg = new string();
   foreach(RepeaterItem currentControl in rptCheckboxes.Items)
   {
       CheckBox currentCheckBox = currentControl.FindControl("cbxMessage");

       if(currentCheckBox != null && currentCheckBox.Checked)
       {
             newmsg += cb[i].Text + '*';
       }
   }

   //This is a bad idea here, but we'll keep it for now
   Response.Write("<BR><BR><BR>" + newmsg);
}

请注意,这是概念证明,并未经过测试才能正常运行。这里的基础是在回发期间,所有控件都会根据aspx页面以及您为该帖子编写的任何逻辑重置。您永远不应该在回发中动态添加控件,并且应该只使用占位符来实现,以便最大程度地降低ViewState损坏/无效的风险。