【问题标题】:ViewState on programmatically loaded usercontrols (restored after Page_Load)以编程方式加载的用户控件上的 ViewState(在 Page_Load 之后恢复)
【发布时间】:2013-07-03 13:34:13
【问题描述】:

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

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

  1. 我使用视图状态保存当前用户控件。
  2. 比我重新加载当前的用户控件。

我的“page_load”总是重新加载当前控件。

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

在下方查找 (* HERE)。 '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";
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

    在 txtTest 以及创建自定义用户控件时尝试 EnableViewState="true" 属性:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2011-01-16
      • 2010-09-17
      相关资源
      最近更新 更多