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

时间:2014-05-16 23:06:10

标签: c# asp.net

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

  1. Main.ASCX
  2. Account_Selection.ASCX
  3. Main包含Account_Selection。主ACX包含用于下拉的事件处理程序,它位于Account_Selection ASCX上。

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

    Account_Selection.ACX 如下:

    <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 });
                }
            }     
    

    主要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"
    
                    }
    

1 个答案:

答案 0 :(得分:1)

导致问题的是更新面板。更新面板的工作方式是更新面板中的更新内容。您无法更新发起&#34;部分回发&#34;的更新面板之外的任何控件。它被称为&#34;部分回发&#34;是因为Render仅在更新面板中为子控件调用。对于发生的事情的更准确的描述是&#34;完整的帖子&#34; (页面上的所有输入控件值都在请求中发送),其中包含&#34;部分返回&#34; (响应)仅包含更新面板中项目的标记。在请求中发送所有输入控制值(包括隐藏的视图状态输入控件)这一事实使得更新面板比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 :从&#34; Account_Selection&#34;中删除UpdatePanel用户控件,并将其移动到您的ASPX页面,并将ASPPa中的UpdatePanel包装在您要更新的内容周围。

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

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