无法从事件处理程序更新ASCX中的标签文本
本文关键字:标签 文本 ASCX 更新 事件处理 程序 | 更新日期: 2023-09-27 18:03:41
我有两个自定义ASP。. NET Web窗体控件:
- 主要。ASCX
- 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"
}
是更新面板导致了这个问题。更新面板的工作方式是只更新更新面板中的内容。您不能更新启动"部分回发"的更新面板之外的任何控件。它被称为"部分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>