我对C#.Net Textbox textchanged事件,AJAX和AutoComplete(https://github.com/devbridge/jQuery-Autocomplete)
有一个非常讨厌的问题我有一个文本框"航班号"自动完成功能。一旦选择了建议,我就会想要使用AJAX并更新"离境机场" (DDL)和"目的地机场" (DDL)。
问题:当我从自动完成中选择任何建议时,航班号不会回复所选的建议值。例如,如果我输入" G91",然后点击" G9101"," G9101"将在瞬间显示在航班号文本框上,然后重置为" G91"因为AutoPostBack。我怎样才能让它回复建议值?
更新:我解决了问题,但在第一篇文章回复后,自动完成功能无效。
航班号文本框
<div class="split half last">
<label for="calculator-flight-number">
Flight Number</label>
<asp:UpdatePanel ID="UpdatePanel7" runat="server">
<ContentTemplate>
<div id="autocomplete-wrap" class="autocomplete-wrap">
<asp:TextBox ID="tbFlightNumber" runat="server" ClientIDMode="Static" CssClass="fill" ontextchanged="tbFlightNumber_TextChanged" AutoPostBack="true"></asp:TextBox>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="bnCalculate" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
机场DDL
<div class="split fill last">
<label class="fill" for="calculator-departure">
Departure</label>
<asp:UpdatePanel ID="UpdatePanel13" runat="server">
<ContentTemplate>
<asp:DropDownList ID="ddlDepartureAirport" CssClass="split threequarters" runat="server">
</asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="bnCalculate" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="tbFlightNumber" EventName="TextChanged" />
</Triggers>
</asp:UpdatePanel>
</div>
<div class="split fill last">
<asp:UpdatePanel ID="UpdatePanel14" runat="server">
<ContentTemplate>
<asp:DropDownList ID="ddlDestinationAirport" CssClass="split threequarters" runat="server">
</asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="bnCalculate" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="tbFlightNumber" EventName="TextChanged" />
</Triggers>
</asp:UpdatePanel>
</div>
的Javascript
<script type="text/javascript">
var options, a;
jQuery(function () {
options = {
serviceUrl: '/Service/FlightSector',
appendTo: 'div#autocomplete-wrap'
};
console.log($('#tbFlightNumber'));
a = $('#tbFlightNumber').autocomplete(options);
});
第一次尝试:
我做了通常的AJAX方式,并为Flight Number做了TextChanged事件。我希望当我点击AutoComplete的建议时,AJAX会启动并更新2个机场。 AJAX没有开火。我打开了#34; AutoPostBack&#34;对于航班号,只返回整个建议框中的第一个字符。对于例如如果&#34; G&#34;是类型,建议会显示&#34; G1002&#34;。当从自动填充中选择G1002作为选择时,只会回发G。
第二次尝试:
我使用了javascript&#34; OnBlur&#34;方法并手动处理回发。
//for flight number postback
protected void Page_Init(object sender, EventArgs e)
{
var onBlurScript = Page.ClientScript.GetPostBackEventReference(tbFlightNumber, "OnBlur");
tbFlightNumber.Attributes.Add("onblur", onBlurScript);
}
private void HandleCustomPostbackEvent(string ctrlName, string args)
{
//Since this will get called for every postback, we only
// want to handle a specific combination of control
// and argument.
if (ctrlName == tbFlightNumber.UniqueID && args == "OnBlur")
{
string flightNumber = tbFlightNumber.Text;
....
//update 2 airports DDL
}
}
这不起作用,因为我无法让AJAX注册2个下拉列表的触发器。此外,选择自动完成建议会触发&#34; onblur&#34;。
第3次尝试: 我尝试使用onfocus代替下一个字段,但它的工作原理并不相同。
我有点困在这里,有人能告诉我一些指示吗? TIA。
答案 0 :(得分:0)
如果您使用的是更新面板,那么您将遇到问题,在第一次服务器调用后它将无法运行。要解决此问题,您需要添加PageRequestManager PageLoad Event以再次加载内容。
在标记添加之前添加页面底部:
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(AddHandler);
function AddHandler(sender,args)
{
var options = {
serviceUrl: '/Service/FlightSector',
appendTo: 'div#autocomplete-wrap'
};
console.log($('#tbFlightNumber'));
var a = $('#tbFlightNumber').autocomplete(options);
}
希望这应该有用。
我遇到了同样的问题,这就是我解决问题的方法。