隐藏字段未设置Ajax AutoCompleteExtender OnClientItemSelected

时间:2014-08-25 14:49:24

标签: c# javascript jquery asp.net ajax

我试图使用以下Ajax AutoCompleteExtender:

<asp:TextBox runat="server" Width="300" ID="tbxItem" CssClass="NormalUpper" />
<asp:AutoCompleteExtender ID="autoCompleteExtenderItemName" runat="server"
    MinimumPrefixLength="1" ServicePath="../Services/AutoCompleteSpecialOrders.asmx"
    ServiceMethod="GetItems" CompletionInterval="100"
    Enabled="True" TargetControlID="tbxItem" CompletionSetCount="15" UseContextKey="True" 
    EnableCaching="true" ShowOnlyCurrentWordInCompletionListItem="True"
    CompletionListCssClass="dbaCompletionList"
    CompletionListHighlightedItemCssClass="AutoExtenderHighlight"
    CompletionListItemCssClass="AutoExtenderList" DelimiterCharacters="">
    OnClientItemSelected="ItemSelected"
</asp:AutoCompleteExtender>
<asp:HiddenField runat="server" ID="hiddenItemId" />

我们正在使用母版页(asp.net 4.0),用户控件和UpdatePanel。我很难获得OnClientItemSelected =&#34; ItemSelected&#34; JavaScript / Jquery函数可以工作。这是ScriptManagerProxy:

<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server" >
    <Scripts>
        <asp:ScriptReference Path="../common/script/AutoExtend.js"/>
    </Scripts>
</asp:ScriptManagerProxy>

以下是AutoExtend.js(JavaScript&amp; Jquery)的内容:

//function ItemSelected(sender, eventArgs) {
//    var hdnValueId = "<%= hiddenItemId.ClientID %>";
//    document.getElementById(hdnValueId).value = eventArgs.get_value();
//    alert(hdnValueId.value);
//    document.getElementById("tbxCatalogQty").focus();
// This try didn't work for me}

function ItemSelected(sender, e) {
    var hdnValueId = $get('<%=hiddenItemId.ClientID %>');
    hdnValueId.value = e.get_value();
    alert(hdnValueId.value);
    document.getElementById("tbxCatalogQty").focus();
}  //Neither did this one.  

警报会从我们的WebService下拉列表中显示正确的值!我似乎无法将隐藏字段设置为此值,因此我可以稍后在代码隐藏中使用它。它始终显示为&#34;&#34;在调试器中运行时。另外,.focus()方法并没有像我想的那样将焦点设置到tbxCatalogQty字段。我也用单引号尝试了这个并且也没有改变任何东西。

在我的代码背后,我尝试按如下方式访问隐藏字段而没有任何运气:

//var itemId = Request.Form[hiddenItemId.Value];
var itemId = hiddenItemId.Value;

我在那里看过几个类似的帖子:12838552&amp; 21978130.我没有看到他们提到使用母版页和用户控件以及UpdatePanel内部的任何内容(但不确定这会有什么不同)。

1 个答案:

答案 0 :(得分:0)

在朋友的帮助下,他刚刚找到了解决方案。首先,我们做了一个JavaScript回发,传递了这样的值:

function ItemSelected(sender, e) {
    var hdnValueId = $get('<%=hiddenItemId.ClientID %>');
    hdnValueId.value = e.get_value();
    window.__doPostBack('UpdatePanelOrdersDetails', hdnValueId.value);
}

然后,在包含AutoCompleteExtender的ASP:Panel中,我们添加了“Onload =”pnlInputCat_Load“参数。

<asp:Panel ID="pnlInputCat" runat="server" OnLoad="pnlInputCat_Load">

然后,在后面的代码中,我们添加了pnlInputCat_Load方法,如下所示:

protected void pnlInputCat_Load(object sender, EventArgs e)
{
    var theId = Request["__EVENTARGUMENT"];
    if (theId != null && !theId.Equals(string.Empty))
    {
        Session["ItemCode"] = Request["__EVENTARGUMENT"];
        tbxCatalogQty.Focus();      
    }
}

当然可能有更好的方法来完成这项工作,但我现在将ItemCode放在会话变量中供以后访问,然后我可以将焦点设置在Catalog Qty文本框中。

感谢所有试图理解/回答上述问题的人。