ASP.NET:如何在viewstate中存储占位符?

时间:2012-11-28 19:46:36

标签: c# asp.net viewstate

我正在尝试开发一个页面。 有一个按钮和一个安置器。 单击按钮时,用户控件将添加到占位符。

每次点击按钮时

,应将许多用户控件添加到占位符。

我正在尝试将视图状态中的占位符存储在preinit事件中,但是在加载事件视图状态中从视图状态检索占位符时保持为空。

下面是我的代码:

  protected void PreInit(object sender, EventArgs e)
        {
            this.OnPreInit(e);
            if (!Page.IsPostBack)
            {
                ViewState["c"] = PlaceHolder1;

            }
            else { PlaceHolder1 = (PlaceHolder)ViewState["c"]; }
        }

 protected void Page_Load(object sender, EventArgs e)
        {

            if(IsPostBack)
        { PlaceHolder1=  (PlaceHolder)ViewState["c"]; }

        }


 public void addDepartmentBtn_Click(object sender, EventArgs e)
        {
            // User Control Code


            c1 = LoadControl("~/AddDepartment.ascx");
            PlaceHolder1.Controls.Add(c1);
}

如果viewstate不适合这种情况,那么实现这一目标的替代方法是什么?

3 个答案:

答案 0 :(得分:2)

如果您尝试动态地向页面添加控件,则必须在每个回发的Init 中完成。这意味着您必须使用数据结构(ViewState中将保留的内容)动态创建的控件列表 - 不是控件本身,但是用作ID的字符串散列是一种常用方法。

每次用户执行操作以向页面添加控件时,都会向列表中添加一个键。在Page Init中,您必须阅读列表并使用它重新创建动态控件并将其添加回页面集合,否则它们不会出现在页面上。

答案 1 :(得分:2)

您必须在每个帖子后面的占位符上重新添加控件。

您对ViewState的尝试正在咆哮错误的树 - ViewState是完全不同的东西,即使您想要,也只能将可序列化的东西存储到ViewState中。

答案 2 :(得分:1)

这不起作用。 ASP.NET服务器控件太复杂,无法存储在ViewState中。 ASP.NET设计的服务器控件是将它们的数据(状态,属性值等)存储在Page的ViewState中。

您可以做的是在ViewState中存储已创建并添加到占位符的AddDepartment用户控件的数量。这可以在PreRender中完成。然后在回发时,您从ViewState中读取此数字,并创建并添加许多AddDepartment控件的占位符。