无法从事件处理程序更新ASCX中的标签文本

本文关键字:标签 文本 ASCX 更新 事件处理 程序 | 更新日期: 2023-09-27 18:03:41

我有两个自定义ASP。. NET Web窗体控件:

  1. 主要。ASCX
  2. Account_Selection。ASCX

Main包含Account_Selection。主ACX包含Account_Selection ASCX上的下拉列表的事件处理程序。

如果合同选择有问题,我想在主ASCX上显示错误消息。然而,消息永远不会显示。已经花了几个小时了,但是这行不通。事件处理程序肯定会被调用。我想知道它是否是一个更新面板或事件处理程序。有人可以帮助,下面是代码片段:

Account_Selection。

<asp:UpdatePanel ID="upContracts" runat="server">
<ContentTemplate>
            <asp:DropDownList ID="dropDown" runat="server" AutoPostBack="true"  OnSelectedIndexChanged="OnDropOptionSelected">
                <asp:ListItem Text="Select Account" Value="0"></asp:ListItem>               
            </asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>  

背后的代码:

public event RequestContractTypeEventHandler RequestContract;
 public void OnDropOptionSelected(string currentContractDescription, string currentContractNumber)
        {
            if (RequestContract != null)
            {
                RequestContract(this, new ContractForAccountEventArgs { ContractDescription = currentContractDescription, Contract = currentContractNumber });
            }
        }     

Main ASCX

<div>
    <OnlineUserControl:ContractsForAccountControl ID="ucContractsForAccountControl" runat="server" />
</div>
<div style="display:none" id="divError" runat="server" class="error-container">
    <asp:Label ID="lblMsg" CssClass="labelError"  runat="server"></asp:Label>
</div>

代码:

   private void InitializeControls()
        {
            ucContractsForAccountControl.RequestContract += new global::OnlineSelfService.Web.usercontrol.RequestContractTypeEventHandler(contractsForAccountControl_RequestContract);
        }
void contractsForAccountControl_RequestContract(object sender, global::OnlineSelfService.Web.usercontrol.ContractForAccountEventArgs e)
        {
            this.lblMsg.Text="something bad happened!;  //THIS LINE DOESN'T GET DISPLAYED
            this.divError.Style.Add("display", "");  //IN DEBUGGER THIS LINE SHOWS "Cannot get inner content of divError because the contents are not literal"
                }

无法从事件处理程序更新ASCX中的标签文本

是更新面板导致了这个问题。更新面板的工作方式是只更新更新面板中的内容。您不能更新启动"部分回发"的更新面板之外的任何控件。它被称为"部分post back"的原因是因为Render只对更新面板中的子控件调用。更准确的描述是"完整发布"(页面上的所有输入控件值都在请求中发送,又名发布)和"部分返回"(响应),其中仅包含更新面板内项目的标记。所有输入控件值(包括隐藏的viewstate输入控件)都在请求中发送,这使得更新面板比json ajax调用更昂贵,后者只发送响应所需的值(在本例中是选定的帐户),但比完整的返回更便宜,因为在响应中只返回更新面板中控件的标记(加上viewstate)。

可能的解决方案:选项2是我的建议,但我不确定有多少其他页面已经使用此控件,并且您需要更新这些页面中的每个页面以添加UpdatePanel。

选项1:在Account_Selection.ASCX的UpdatePanel中移动错误标签。如果您想在所选帐户更改时更新UpdatePanel之外的其他数据,则此选项将无法帮助您。

<asp:UpdatePanel ID="upContracts" runat="server">
<ContentTemplate>
            <asp:DropDownList ID="dropDown" runat="server" AutoPostBack="true"  OnSelectedIndexChanged="OnDropOptionSelected">
                <asp:ListItem Text="Select Account" Value="0"></asp:ListItem>               
            </asp:DropDownList>
<div style="display:none" id="divError" runat="server" class="error-container">
    <asp:Label ID="lblMsg" CssClass="labelError"  runat="server"></asp:Label>
</div>
</ContentTemplate>
</asp:UpdatePanel>  

背后代码:

public event RequestContractTypeEventHandler RequestContract;
 public void OnDropOptionSelected(string currentContractDescription, string currentContractNumber)
        {
            if (RequestContract != null)
            {
            try{
                RequestContract(this, new ContractForAccountEventArgs { ContractDescription = currentContractDescription, Contract = currentContractNumber });
            }
            catch(Exception ex){
                this.lblMsg.Text="something bad happened!";  
                this.divError.Style.Add("display", "");  
            }
            }
        }     

选项2:从"Account_Selection"用户控件中删除UpdatePanel,并将其移动到你的ASPX页面,并在ASPX中围绕你想要更新的内容包装UpdatePanel。

你的ASPX页面看起来像这样:

<asp:UpdatePanel ID="upContracts" runat="server">
<ContentTemplate>
    <OnlineUserControl:MainControlTagName ID="myMainControl" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>