【问题标题】:ASP.Net Trigger user control dropdownlist change from UpdatePanelASP.Net 从 UpdatePanel 触发用户控件下拉列表更改
【发布时间】:2020-03-17 07:51:57
【问题描述】:


我需要从更新面板触发用户控件中的更新事件,但到目前为止我遇到了一些问题。这是我的场景:
UC1:

    //uc1
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FilterControlRow.ascx.cs" Inherits="FilterWebPart.FilterControlRow" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>

// other controls
<div runat="server" id="inputFilters" class="inputFilters">
    <asp:Button ID="btnOpenBracket" runat="server" CssClass="filterBracketButton" OnClick="btnOpenBracket_Click" />
    <asp:DropDownList ID="ddlPropertyNames" runat="server" OnSelectedIndexChanged="ddlPropertyNames_SelectedIndexChanged"
        ViewStateMode="Enabled" />
        <div class="filterValidator">
        <asp:DropDownList ID="ddlLookup" CssClass="filterTxtValue" runat="server" ViewStateMode="Enabled" />
        </div>

</div>

当更改 ddlPropertyNames 时,会更新 ddlLookup。

UC2:

//uc2
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FilterControlNew.ascx.cs"
    Inherits="FilterWebPart.FilterControlNew" ViewStateMode="Disabled" %>
<%@ Register Src="FilterWebPart.FilterControlRow.ascx" TagName="FilterControlRow" TagPrefix="uc2" %>

<asp:UpdatePanel ID="UpdatePanelFilter" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional" ViewStateMode="Enabled" OnInit="UpdatePanelFilter_OnInit">
    <ContentTemplate>
        //other controls
            <asp:Repeater ID="Repeater1" runat="server" Visible="true" OnItemDataBound="Repeater1_ItemDataBound" 
                OnItemCommand="Repeater1_ItemCommand" ViewStateMode="Enabled">
                <ItemTemplate>
                    <div class="filterRow">
                        <uc2:filtercontrolrow id="FilterControlRow1" runat="server" />
                    </div>
                </ItemTemplate>
            </asp:Repeater>
            <asp:Button ID="btnFind" runat="server" OnClick="btnFind_Click" CssClass="filterButton" Text="Find" 
                ViewStateMode="Enabled" ValidationGroup="Filter" />
            <asp:Button ID="btnAdd" runat="server" OnClick="btnAdd_Click" CssClass="filterButton" Text="Add" ViewStateMode="Enabled" />
        </asp:Panel>
      // more controls
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="btnFind" />
    </Triggers>
</asp:UpdatePanel>

UC2 只包含转发器中的第一个用户控件,因此我可以有多个过滤器。然后在我的默认页面中:

<uc1:filtercontrolnew id="WebPartFilter" runat="server" />

主要问题是第一个用户控件正在执行整页回发,我想避免这种情况并将其限制为仅更新用户控件内的下拉列表。我在某处看到 UpdatePanel 是要走的路,但经过多次尝试,它要么什么都不做,要么再次进行整页回发。也许我错误地包装了更新面板,但不幸的是我没有太多使用它们的经验。 任何帮助将不胜感激:)

【问题讨论】:

    标签: c# asp.net postback


    【解决方案1】:

    第一步使用异步回发触发器,并添加事件名称

      //uc2
        <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FilterControlNew.ascx.cs"
            Inherits="FilterWebPart.FilterControlNew" ViewStateMode="Disabled" %>
        <%@ Register Src="FilterWebPart.FilterControlRow.ascx" TagName="FilterControlRow" TagPrefix="uc2" %>
    
        <asp:UpdatePanel ID="UpdatePanelFilter" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional" ViewStateMode="Enabled" OnInit="UpdatePanelFilter_OnInit">
            <ContentTemplate>
                //other controls
                    <asp:Repeater ID="Repeater1" runat="server" Visible="true" OnItemDataBound="Repeater1_ItemDataBound" 
                        OnItemCommand="Repeater1_ItemCommand" ViewStateMode="Enabled">
                        <ItemTemplate>
                            <div class="filterRow">
                                <uc2:filtercontrolrow id="FilterControlRow1" runat="server" />
                            </div>
                        </ItemTemplate>
                    </asp:Repeater>
                    <asp:Button ID="btnFind" runat="server" OnClick="btnFind_Click" CssClass="filterButton" Text="Find" 
                        ViewStateMode="Enabled" ValidationGroup="Filter" />
                    <asp:Button ID="btnAdd" runat="server" OnClick="btnAdd_Click" CssClass="filterButton" Text="Add" ViewStateMode="Enabled" />
                </asp:Panel>
              // more controls
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="btnFind" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
    

    第二步在 Page_Load 中添加 if(!isPostback) 并将所有你不想在回发时刷新的代码放入其中

    请注意,您应该在更新面板中为您正在使用的每个工具添加触发器作为按钮中继器等。并确保添加您正在使用的事件

    【讨论】:

    • 问题是我希望“查找”按钮进行整页回发,但在此之前,需要从第一个下拉列表更新第二个下拉列表,而当前没有发生
    • 基本上工作流程应该是 1) 更改第一个下拉列表 (ddlPropertyNames) 中的值,而不进行整页回发 - 2) 更新第二个下拉列表中的值(没有整页回发) - 3) 查找(整页回发)
    • 尽量不要这样做,因为将来您将处理此按钮回发时的所有元素,因此请尝试从回发处理按钮并在第二个下拉列表从第一个更新之后一个简单的刷新页面使用 Response.Redirect(Request.RawURL);这种方法的作用类似于回发,但您正在处理每个事件
    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多