Asp.net UpdatePanel在首次单击时不工作

Asp.net UpdatePanel在首次单击时不工作,asp.net,asp.net-ajax,Asp.net,Asp.net Ajax,我有一个带有ScriptManager控件、一些LinkButton控件和占位符控件的ASPX页面。每个链接按钮将在占位符控件中添加(OnPageLoad)一个特定的用户控件。每个UserControl都有一个ScriptManagerProxy控件和一个UpdatePanel(UpdateMode=Conditional),其中包含一些复选框(AutoPostback=true)控件和一个GridView 问题是,当您单击复选框控件时,它被选中,但什么也没有发生。当您再次单击它时,它将被取消选

我有一个带有ScriptManager控件、一些LinkButton控件和占位符控件的ASPX页面。每个链接按钮将在占位符控件中添加(OnPageLoad)一个特定的用户控件。每个UserControl都有一个ScriptManagerProxy控件和一个UpdatePanel(UpdateMode=Conditional),其中包含一些复选框(AutoPostback=true)控件和一个GridView

问题是,当您单击复选框控件时,它被选中,但什么也没有发生。当您再次单击它时,它将被取消选中,并导致整个页面的完整回发。复选框控件的后续单击按其应有的方式异步工作

用户控件1:标记

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControl1.ascx.cs" Inherits="UserControls_UserControl1" %>


<div>

<asp:ScriptManagerProxy ID="smp1" runat="server" />

<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
<ContentTemplate>

<h1>CheckBox Test 1</h1>

<asp:Panel ID="pnlOptions" runat="server" Visible="true">
    <asp:Panel ID="pnlCheckTest1" runat="server">
        <asp:CheckBox ID="chkCheckTest1" 
                      AutoPostBack="true"
                      Text="Test 1" 
                      OnCheckedChanged="chkCheckTest1_CheckChanged"
                      runat="server" />
    </asp:Panel>
    <asp:Panel ID="pnlCheckTest2" runat="server">
        <asp:CheckBox ID="chkCheckTest2" 
                      AutoPostBack="true"
                      Text="Test 2" 
                      OnCheckedChanged="chkCheckTest2_CheckChanged"
                      runat="server" />
    </asp:Panel> 
</asp:Panel>

<br /><br />

<div>
<asp:Label ID="lblTestCheck1" runat="server" />
</div>

</ContentTemplate>
</asp:UpdatePanel>

</div>
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControl2.ascx.cs" Inherits="UserControls_UserControl2" %>


<div>

<asp:ScriptManagerProxy ID="smp1" runat="server" />

<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
<ContentTemplate>

<h1>CheckBox Test 2</h1>

<asp:Panel ID="pnlOptions" runat="server" Visible="true">
    <asp:Panel ID="pnlCheckTest1" runat="server">
        <asp:CheckBox ID="chkCheckTest1" 
                      AutoPostBack="true"
                      Text="Test 1" 
                      OnCheckedChanged="chkCheckTest1_CheckChanged"
                      runat="server" />
    </asp:Panel>
    <asp:Panel ID="pnlCheckTest2" runat="server">
        <asp:CheckBox ID="chkCheckTest2" 
                      AutoPostBack="true"
                      Text="Test 2" 
                      OnCheckedChanged="chkCheckTest2_CheckChanged"
                      runat="server" />
    </asp:Panel> 
</asp:Panel>

<br /><br />

<div>
<asp:Label ID="lblTestCheck2" runat="server" />
</div>

</ContentTemplate>
</asp:UpdatePanel>

</div>
<%@ Page Title=""  Language="C#" AutoEventWireup="true"CodeFile="CheckBoxTest.aspx.cs" Inherits="CheckBoxTest" %>
<html>
<head id="head1" runat="server">
<title>Check Box Test</title>
</head>

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="sm1" runat="server" />


<div id="Div1" runat="server">
    <asp:LinkButton ID="lbCheckTest1" runat="server" Text="Check Test 1" 
            onclick="lbCheckTest1_Click" />
    <br />
    <asp:LinkButton ID="lbCheckTest2" runat="server" Text="Check Test 2" 
            onclick="lbCheckTest2_Click" />
</div>

<br /><br /><br /><br />

<div id="Div2" runat="server">
    <asp:PlaceHolder 
        ID="phTable"
        runat="server" />        
</div>
</form>
</body>
</html>
用户控件2:标记

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControl1.ascx.cs" Inherits="UserControls_UserControl1" %>


<div>

<asp:ScriptManagerProxy ID="smp1" runat="server" />

<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
<ContentTemplate>

<h1>CheckBox Test 1</h1>

<asp:Panel ID="pnlOptions" runat="server" Visible="true">
    <asp:Panel ID="pnlCheckTest1" runat="server">
        <asp:CheckBox ID="chkCheckTest1" 
                      AutoPostBack="true"
                      Text="Test 1" 
                      OnCheckedChanged="chkCheckTest1_CheckChanged"
                      runat="server" />
    </asp:Panel>
    <asp:Panel ID="pnlCheckTest2" runat="server">
        <asp:CheckBox ID="chkCheckTest2" 
                      AutoPostBack="true"
                      Text="Test 2" 
                      OnCheckedChanged="chkCheckTest2_CheckChanged"
                      runat="server" />
    </asp:Panel> 
</asp:Panel>

<br /><br />

<div>
<asp:Label ID="lblTestCheck1" runat="server" />
</div>

</ContentTemplate>
</asp:UpdatePanel>

</div>
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControl2.ascx.cs" Inherits="UserControls_UserControl2" %>


<div>

<asp:ScriptManagerProxy ID="smp1" runat="server" />

<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
<ContentTemplate>

<h1>CheckBox Test 2</h1>

<asp:Panel ID="pnlOptions" runat="server" Visible="true">
    <asp:Panel ID="pnlCheckTest1" runat="server">
        <asp:CheckBox ID="chkCheckTest1" 
                      AutoPostBack="true"
                      Text="Test 1" 
                      OnCheckedChanged="chkCheckTest1_CheckChanged"
                      runat="server" />
    </asp:Panel>
    <asp:Panel ID="pnlCheckTest2" runat="server">
        <asp:CheckBox ID="chkCheckTest2" 
                      AutoPostBack="true"
                      Text="Test 2" 
                      OnCheckedChanged="chkCheckTest2_CheckChanged"
                      runat="server" />
    </asp:Panel> 
</asp:Panel>

<br /><br />

<div>
<asp:Label ID="lblTestCheck2" runat="server" />
</div>

</ContentTemplate>
</asp:UpdatePanel>

</div>
<%@ Page Title=""  Language="C#" AutoEventWireup="true"CodeFile="CheckBoxTest.aspx.cs" Inherits="CheckBoxTest" %>
<html>
<head id="head1" runat="server">
<title>Check Box Test</title>
</head>

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="sm1" runat="server" />


<div id="Div1" runat="server">
    <asp:LinkButton ID="lbCheckTest1" runat="server" Text="Check Test 1" 
            onclick="lbCheckTest1_Click" />
    <br />
    <asp:LinkButton ID="lbCheckTest2" runat="server" Text="Check Test 2" 
            onclick="lbCheckTest2_Click" />
</div>

<br /><br /><br /><br />

<div id="Div2" runat="server">
    <asp:PlaceHolder 
        ID="phTable"
        runat="server" />        
</div>
</form>
</body>
</html>
主页:标记

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControl1.ascx.cs" Inherits="UserControls_UserControl1" %>


<div>

<asp:ScriptManagerProxy ID="smp1" runat="server" />

<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
<ContentTemplate>

<h1>CheckBox Test 1</h1>

<asp:Panel ID="pnlOptions" runat="server" Visible="true">
    <asp:Panel ID="pnlCheckTest1" runat="server">
        <asp:CheckBox ID="chkCheckTest1" 
                      AutoPostBack="true"
                      Text="Test 1" 
                      OnCheckedChanged="chkCheckTest1_CheckChanged"
                      runat="server" />
    </asp:Panel>
    <asp:Panel ID="pnlCheckTest2" runat="server">
        <asp:CheckBox ID="chkCheckTest2" 
                      AutoPostBack="true"
                      Text="Test 2" 
                      OnCheckedChanged="chkCheckTest2_CheckChanged"
                      runat="server" />
    </asp:Panel> 
</asp:Panel>

<br /><br />

<div>
<asp:Label ID="lblTestCheck1" runat="server" />
</div>

</ContentTemplate>
</asp:UpdatePanel>

</div>
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControl2.ascx.cs" Inherits="UserControls_UserControl2" %>


<div>

<asp:ScriptManagerProxy ID="smp1" runat="server" />

<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
<ContentTemplate>

<h1>CheckBox Test 2</h1>

<asp:Panel ID="pnlOptions" runat="server" Visible="true">
    <asp:Panel ID="pnlCheckTest1" runat="server">
        <asp:CheckBox ID="chkCheckTest1" 
                      AutoPostBack="true"
                      Text="Test 1" 
                      OnCheckedChanged="chkCheckTest1_CheckChanged"
                      runat="server" />
    </asp:Panel>
    <asp:Panel ID="pnlCheckTest2" runat="server">
        <asp:CheckBox ID="chkCheckTest2" 
                      AutoPostBack="true"
                      Text="Test 2" 
                      OnCheckedChanged="chkCheckTest2_CheckChanged"
                      runat="server" />
    </asp:Panel> 
</asp:Panel>

<br /><br />

<div>
<asp:Label ID="lblTestCheck2" runat="server" />
</div>

</ContentTemplate>
</asp:UpdatePanel>

</div>
<%@ Page Title=""  Language="C#" AutoEventWireup="true"CodeFile="CheckBoxTest.aspx.cs" Inherits="CheckBoxTest" %>
<html>
<head id="head1" runat="server">
<title>Check Box Test</title>
</head>

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="sm1" runat="server" />


<div id="Div1" runat="server">
    <asp:LinkButton ID="lbCheckTest1" runat="server" Text="Check Test 1" 
            onclick="lbCheckTest1_Click" />
    <br />
    <asp:LinkButton ID="lbCheckTest2" runat="server" Text="Check Test 2" 
            onclick="lbCheckTest2_Click" />
</div>

<br /><br /><br /><br />

<div id="Div2" runat="server">
    <asp:PlaceHolder 
        ID="phTable"
        runat="server" />        
</div>
</form>
</body>
</html>
试试这个

<asp:UpdatePanel runat="server"><%--your updatepanel--%>
    <ContentTemplate>
    <%--something that you want to update on checkbox check change event--%>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="your_checkbox_control_id" EventName="CheckedChanged" />
        <%--add AsyncPostBackTrigger for checkbox event --%>
    </Triggers>
</asp:UpdatePanel>

原来问题与UpdatePanel无关。问题在于动态加载的用户控件

ViewState是动态加载控件的问题。最好在执行生命周期的OnPageInit事件期间加载它们。此外,为确保ViewState正常工作,请为控件分配一个有效ID

    protected void Page_Init(object sender, EventArgs e)
    {
        if (Page.IsPostBack)
        {
            try
            {
                phTable.Controls.Clear();
                Control ctrl = LoadControl(Session["CurrentControl"] as String);
                ctrl.ID = Session["CurrentControlID"].ToString();
                phTable.Controls.Add(ctrl);
            }
            catch
            {
                // Handle Error...
            }
        }
    }


protected void lbCheckTest1_Click(object sender, EventArgs e)
{
    Session["CurrentControl"] = "~/UserControls/UserControl1.ascx";
    Session["CurrentControlID"] = "UserControl1";        
    Control ctrl = LoadControl(Session["CurrentControl"] as String);
    ctrl.ID = Session["CurrentControlID"].ToString();
    phTable.Controls.Clear();
    phTable.Controls.Add(ctrl);
}

该复选框位于UpdatePanel内,因此它将自动触发异步回发。我将该复选框置于更新面板外,并将其设置为触发器,但这并没有改变任何内容(不明白为什么它真的会这样)。我把所有的代码都放在上面,你可以试试。