我在下面有两个自定义ASP.NET Web窗体控件:
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"
}
答案 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>