我有一个用于输入所需用户名的文本框。当用户键入其名称并且输入失去焦点时,我想发送异步回发以检查他们的用户名是否已被占用。这在没有引发错误的情况下工作正常,但我也想处理错误。
Per MSDN,我已经向ScriptManager添加了一个AsyncPostBackError处理程序。我在每次加载页面时都尝试过这种方法,并且只在非回发页面加载时尝试过。
我在UpdatePanel中有我的TextBox,如下所示:
<asp:UpdatePanel ID="upLogin" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
<ContentTemplate>
<asp:TextBox ID="tbLogin" runat="server" placeholder="username"
OnTextChanged="tbLogin_TextChanged" required />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="tbLogin" EventName="TextChanged" />
</Triggers>
</asp:UpdatePanel>
在代码隐藏中,我有:
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager.GetCurrent(Page).AsyncPostBackError +=
BootstrapLogin_AsyncPostBackError;
}
void BootstrapLogin_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
{
tbLogin.Attributes.Remove("data-success");
tbLogin.Attributes["data-error-message"] = myErrorMessage;
}
protected void tbLogin_TextChanged(object sender, EventArgs e)
{
throw new Exception("what?");
}
我还在我的Default.aspx页面标记中添加了Async="true"
。
当我在TextBox上有AutoPostBack="true"
时,会抛出错误并且永远不会调用AsyncPostBackError处理程序。出于某种原因,在回发期间,Page.IsAsync
是错误的。我怀疑这是没有处理的原因(或说明原因)。
当我设置AutoPostBack="false"
时,尽管指定了触发器,但根本没有触发回发。
想法?
答案 0 :(得分:0)
看起来下面的代码无法正常工作
ScriptManager.GetCurrent(Page).AsyncPostBackError +=
BootstrapLogin_AsyncPostBackError;
而不是我只是在标记中设置OnAsyncPostBackError
的{{1}}属性,它与ScriptManager
中的AutoPostback = "True"
一起使用。
TextBox
不确定为什么你的代码不起作用。它会选择正确的ScriptManager。
<强>更新强>
解决了! 我应该在页面生命周期中刷新我的知识:(
实际上,我们应该将您的代码添加到<asp:ScriptManager ID="ScriptManager1" runat="server" OnAsyncPostBackError="BootstrapLogin_AsyncPostBackError"></asp:ScriptManager>
而不是Page_Init
。以下工作完美。
Page_Load
更新2
参见此屏幕截图
希望这有帮助!