以编程方式加载的usercontrols上的ViewState(在Page_Load之后恢复)

时间:2013-07-03 13:34:13

标签: asp.net user-controls updatepanel viewstate ascx

我正在尝试使用导航栏创建一个简单的网页,并以编程方式加载一些用户控件(ascx)。 所有控件都在更新面板中。

当我点击链接按钮(从导航栏)时,我会执行以下操作:

  1. 我使用viewstate保存当前的用户控件。
  2. 我重新加载当前的usercontrol。
  3. 我的'page_load'总是重新加载当前控件。

    始终为以编程方式加载的控件分配相同的ID允许我保存usercontrol视图状态。 所以一切看起来都不错,除了一件小事: usercontrol viewstate在usercontrol Page_Load 期间不可用!

    请看下面的(*这里)。 'txtTest.Text'值始终为“0”(也在回发期间)。

    似乎在(usercontrol)Page_Load之后恢复了用户控件视图状态。 怎么可能?

    ---“DEFAULT.ASPX”:---

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="sm" runat="server">
            </asp:ScriptManager>
            <asp:UpdatePanel ID="pnlMain" runat="server">
                <ContentTemplate>
                    <div class="links">
                        <asp:LinkButton ID="lnkButton1" runat="server" OnClick="lnkButton1_Click" Text="Link 1"></asp:LinkButton>
                        <asp:LinkButton ID="lnkButton2" runat="server" OnClick="lnkButton2_Click" Text="Link 2"></asp:LinkButton>
                    </div>
                    <br />
                    <asp:Panel ID="pnlCtrl" runat="server"></asp:Panel>
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
        </form>
    </body>
    </html>
    

    ---“DEFAULT.ASPX.CS”:---

    private string CtrlAscx
    {
        get
        {
            if (ViewState["CtrlAscx"] == null)
            {
                ViewState["CtrlAscx"] = String.Empty;
            }
    
            return ViewState["CtrlAscx"].ToString();
        }
        set
        {
            ViewState["CtrlAscx"] = value;
        }
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        loadMyControl();
    }
    
    private void loadMyControl()
    {
        if (!String.IsNullOrEmpty(CtrlAscx))
        {
            pnlCtrl.Controls.Clear();
            Control c = LoadControl(CtrlAscx);
            c.ID = CtrlAscx + "ID";         // this line is mandatory in order to mantain the usercontrol viewstate
            pnlCtrl.Controls.Add(c);
        }
    }
    
    protected void lnkButton1_Click(Object sender, EventArgs e)
    {
        CtrlAscx = "Control1.ascx";
        loadMyControl();
    }
    
    protected void lnkButton2_Click(Object sender, EventArgs e)
    {
        CtrlAscx = "Control2.ascx";
        loadMyControl();
    }
    

    - “CONTROL1.ASCX” -

    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Control1.ascx.cs" Inherits="WebTest.Control1" %>
    Control1: <asp:TextBox id="txtTest" runat="server" Text="0"></asp:TextBox>
    <asp:Button ID="btnTest" runat="server" />
    

    - “CONTROL1.ASCX.CS” -

    public partial class Control1 : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (txtTest.Text == "0")        // * HERE
            {
                txtTest.Text = "1";
            }
        }
    }
    

2 个答案:

答案 0 :(得分:2)

这篇文章挽救了我的生命:

http://www.singingeels.com/Articles/Dynamically_Created_Controls_in_ASPNET.aspx

特别是'Dynamically Created Controls.zip'文件和'Scenario 3'。

答案 1 :(得分:0)

在文本测试时以及在创建自定义用户控件时尝试 EnableViewState =“true”属性:

.
.
c.EnableViewState = true;
pnlCtrl.Controls.Add(c);