【问题标题】:ASP .NET Multiple Usercontrols on Single Page - Postback IssuesASP .NET 单个页面上的多个用户控件 - 回发问题
【发布时间】:2019-09-03 13:41:36
【问题描述】:

我正在使用 Visual Studio 2015 开发面向 .NET 4.0 的 Web 应用程序 (IIS)。

我有一个包含 4 个用户控件 (.ascx) 的 .aspx。当其中一个用户控件回发主 .aspx 并且其他三个用户控件也进行回发时。

我正在寻找一种方法来防止其他用户控件在其中一个执行回发时进行回发。

我尝试将每个用户控件放在更新面板中(代码如下)。我尝试在每个用户控件中放置一个更新面板。我尝试更改 ChildrenAsTriggers 和 UpdateMode 属性。我尝试在每个用户控件中创建一个 Click 事件,该事件在用户控件中的项目回发时引发(例如下面的一个用户控件)。

无论如何,页面和所有四个用户控件都会在其中一个执行回发时进行一次回发。

主 .ASPX:

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<%@ Register TagPrefix="uc1" TagName="Components" Src="Components.ascx" %>
<%@ Register TagPrefix="uc2" TagName="Options" Src="Options.ascx" %>
<%@ Register TagPrefix="uc3" TagName="Settings" Src="Settings.ascx" %>
<%@ Register TagPrefix="uc4" TagName="Menu" Src="Menu.ascx" %>
<form id="form1" runat="server">
        <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" EnablePartialRendering="true"></cc1:ToolkitScriptManager>

        <asp:Panel ID="pnlComponents" runat="server">
            <asp:UpdatePanel ID="updpnlComponents" runat="server">
                <ContentTemplate>
                    <uc1:Components id="Components" runat="server"></uc1:Components>
                </ContentTemplate>
            </asp:UpdatePanel>
        </asp:Panel>

        <asp:Panel ID="pnlOptions" runat="server">
            <asp:UpdatePanel ID="updpnlOptions" runat="server">
                <ContentTemplate>
                    <uc2:Options id="Options" runat="server" CssClass="jQTrackChanges"></uc2:Options>
                </ContentTemplate>
            </asp:UpdatePanel>
        </asp:Panel>

        <asp:Panel ID="pnlSettings" runat="server">
            <asp:UpdatePanel ID="updpnlSettings" runat="server">
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="Settings" EventName="Click" />
                </Triggers>
                <ContentTemplate>
                    <uc3:Settings id="Settings" runat="server" CssClass="jQTrackChanges"></uc3:Settings>
                </ContentTemplate>
            </asp:UpdatePanel>
        </asp:Panel>

        <asp:Panel ID="pnlMenu" runat="server">
            <asp:UpdatePanel ID="updpnlMenu" runat="server">
                <ContentTemplate>
                    <uc4:Menu id="Menu" runat="server" CssClass="jQTrackChanges"></uc4:Menu>
                </ContentTemplate>
            </asp:UpdatePanel>
        </asp:Panel>
    </form>

Settings.ascx.vb:

Private Sub chkIn_CheckedChanged(sender As Object, e As EventArgs) Handles chkIn.CheckedChanged
    RaiseEvent Click(Me, e)
End Sub

Private Sub chkOut_CheckedChanged(sender As Object, e As EventArgs) Handles chkOut.CheckedChanged
    RaiseEvent Click(Me, e)
End Sub

Public Event Click As EventHandler

编辑 - 添加 AutoPostBack=false 和 UpdateMode=Conditional 无效。当一个用户控件返回时,所有四个用户控件仍会回发。

更新了主 .ASPX:

    <asp:Panel ID="pnlOptions" runat="server" AutoPostBack="false">
        <asp:UpdatePanel ID="updpnlOptions" runat="server" UpdateMode="Conditional" AutoPostBack="false">
            <ContentTemplate>
                <uc2:Options id="Options" runat="server" AutoPostBack="false" CssClass="jQTrackChanges"></uc2:Options>
            </ContentTemplate>
        </asp:UpdatePanel>
    </asp:Panel>

    <asp:Panel ID="pnlSettings" runat="server" AutoPostBack="false">
        <asp:UpdatePanel ID="updpnlSettings" runat="server" UpdateMode="Conditional" AutoPostBack="false">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Settings" EventName="Click" />
            </Triggers>
            <ContentTemplate>
                <uc3:Settings id="Settings" runat="server" AutoPostBack="false" CssClass="jQTrackChanges"></uc3:Settings>
            </ContentTemplate>
        </asp:UpdatePanel>
    </asp:Panel>

    <asp:Panel ID="pnlMenu" runat="server" AutoPostBack="false">
        <asp:UpdatePanel ID="updpnlMenu" runat="server" UpdateMode="Conditional" AutoPostBack="false">
            <ContentTemplate>
                <uc4:Menu id="Menu" runat="server" AutoPostBack="false" CssClass="jQTrackChanges"></uc4:Menu>
            </ContentTemplate>
        </asp:UpdatePanel>
    </asp:Panel>

【问题讨论】:

    标签: asp.net vb.net user-controls updatepanel postback


    【解决方案1】:

    我们最终放弃并使用 Javascript 来替换尽可能多的回发活动,以尽量减少发生的回发次数。

    【讨论】:

      【解决方案2】:

      请使用属性窗口中的自动回发属性。将其默认行为更改为真或假,然后重试。

      【讨论】:

      • 每个用户控件中的各个控件需要回发,因此它们的 AutoPostBack 属性设置为 TRUE。我尝试在每个面板、更新面板和用户控件上将 AutoPostBack 属性设置为 FALSE,但当其中一个控件执行时,所有控件仍会回发。
      • 请在您的更新面板中添加 UpdateMode="Conditional"。
      • 无变化 - 当其中一个控件发生变化时,所有四个控件仍会回发。更新了上面发布的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      相关资源
      最近更新 更多