ASP.NET中UpdatePanel内的OnTextChanged事件未触发

10

我正在使用ASP.NET的UpdatePanel通过对TextBox使用TextChanged事件来检索用户信息,以下是我的代码:

<asp:UpdatePanel runat="server" ID="up1" ChildrenAsTriggers="true">
<ContentTemplate>
    <asp:TextBox runat="server" ID="loginEmail" Text="Email" 
        CssClass="textBoxes" OnTextChanged="userInfo" AutoPostBack="true"></asp:TextBox>
</ContentTemplate>
<Triggers>
    <asp:AsyncPostBackTrigger ControlID="loginEmail" EventName="TextChanged" />
</Triggers>
</asp:UpdatePanel>

代码如下:

string url, emailInfo;
emailInfo = loginEmail.Text;
url = Membership.GetUserNameByEmail(emailInfo);

emailText.InnerText = "Email: " + emailInfo;
urlText.InnerText = "Webiste: http://www.Elwazefa.com/User/" + url ; 

代码在文本更改事件上不会触发,但会在ButtonClick或PageLoad上触发。

问题是什么?

使用ASP.NET 4.0


如果你无法在标题中充分概括问题...那么很可能要么太笼统,要么缺乏适当的故障排除水平。(在这种情况下,它缺少大部分适用上下文和足够描述它为什么“不起作用”的说明。) - user166390
你能展示一下你完整的“userInfo”函数吗? - Keith Walton
TextChanged事件不会在每次按键时触发,如果这是你想要的:https://dev59.com/9nRA5IYBdhLWcg3wyRF7 和 https://dev59.com/0HNA5IYBdhLWcg3wVcFx. - patmortech
默认情况下,“ChildrenAsTriggers”为真,当“ChildrenAsTriggers”为真时,您无需添加“loginEmail”的触发器。我认为这些都是调试尝试。 - sq33G
@sq33G - 是的,我正在努力找出问题所在。 - Wahtever
2个回答

12
<asp:TextBox AutoPostBack="true" OnTextChanged="thingId_TextChanged" ID="thingId" runat="server"></asp:TextBox>

AutoPostBack 在文本框上会在焦点从文本框移开时触发回传。任何随后的回传(可能由于按钮点击或文本框焦点变化)都将触发TextChanged事件。因此,您需要确保:

  1. 在更改文本后,您正在移出文本框。
  2. 您更改的所有控件都是更新面板的一部分(可以是不同的更新面板)。如果它们不属于任何更新面板,则这些更改不会反映在客户端。

我的猜测是您可能遇到了问题 #2。您可以使用诸如Fiddler(或FireFox上的Firebug)之类的工具来检查浏览器是否在焦点从文本框移开时触发AJAX(XHR)请求。


4
正如@VinayC所述,AutoPostBack意味着在您的TextBox失去焦点时页面将会回发到服务器。没有内置的事件会在输入文本时每添加一个字符都引起回发,这是有充分理由的。虽然UpdatePanel回发不会导致页面闪烁,但它们可能和完整的回发一样重。
如果您想解决这个问题,可以给您的文本框添加一个客户端onchanged事件处理程序,其JavaScript将从Page.ClientScript.GetPostBackEventReference()构建。 正确的解决方案是在JavaScript代码中使用AJAX方法调用,而不是在onchanged中使用UpdatePanel部分回发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接