Javascript код для получения ProductID?

У меня есть веб-сервис, который получает ProductName, и мне нужно, чтобы Продукты, выпадающие из AutoExtender, были ссылками на отдельные страницы каждого продукта. Сейчас URL-адрес заполняется именем продукта, а не идентификатором:

Default.aspx?id=Test%20Product

должно быть

Default.aspx?id=519

* Примечание - этот сайт предназначен только для внутреннего использования, поэтому мы не беспокоимся о том, что его могут взломать прямо сейчас. Мы хотим, чтобы сайт работал.

Мне сказали, что люди на форуме asp.net не могут сделать то, что я хочу, поэтому я пришел сюда в надежде на некоторую помощь. Я думаю, что это javascript, который получает ProductName от веб-службы, и мне нужно, чтобы получить ProductID. Я попытался переписать цикл For Each, чтобы включить ProductID вместо ProductName, но затем AutoCompleteExtender отображает только идентификаторы в результатах вместо ProductNames.

Javascript:

<script type="text/javascript">
function AutoCompleteClientMethod(source, eventArgs) {
    var value = eventArgs.get_value();
    window.location = ("/Product/Default.aspx?id=" + value)
} 
</script>

Вот код для моего autoCompleteExtender и веб-службы:

<asp:TextBox ID="Search" runat="server" AutoComplete="off"></asp:TextBox>
    <asp:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="Search" ServicePath="~/ProductSearch.asmx" ServiceMethod="GetProducts" MinimumPrefixLength="1" CompletionSetCount="120" EnableCaching="true" OnClientItemSelected="AutoCompleteClientMethod">
    </asp:AutoCompleteExtender>

' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class ProductSearch
Inherits System.Web.Services.WebService


<WebMethod()> _
Public Function GetProducts(ByVal prefixText As String, ByVal count As Integer) As String()
    Dim ProductSql As String = "Select DISTINCT ProductID, ProductName FROM Product WHERE ProductName LIKE '%" & prefixText & "%' ORDER BY ProductName ASC"
    Dim sqlConn As New SqlConnection
    sqlConn.Open()
    Dim myCommand As New SqlCommand(ProductSql, sqlConn)
    Dim myReader As SqlDataReader = myCommand.ExecuteReader()
    Dim myTable As New DataTable
    myTable.TableName = "ProductSearch"
    myTable.Load(myReader)
    sqlConn.Close()
    Dim items As String() = New String(myTable.Rows.Count - 1) {}
    Dim i As Integer = 0
    For Each dr As DataRow In myTable.Rows
        items.SetValue(dr("ProductName").ToString(), i)
        i += 1
    Next
    Return items
End Function
End Class

Изменить: добавление способа отображения результатов поиска до переключения на AutoCompleteExtender. Я пытался включить это в то, что у меня сейчас, но я не могу заставить что-то работать правильно. Обратите внимание, что это СТАРЫЙ код, а выше - весь код, который я использую СЕЙЧАС.

<div class="hiddenResults">
    <ul id="hiddenResults" style="display:none;">
    <asp:ListView ID="lvProducts" runat="server" DataSourceID="dsProducts">
    <ItemTemplate>
        <li><a href="/Product/Default.aspx?id=<%# eval("ProductID") %>"><span class="title"><%# eval("ProductName") %></a></span></li>
    </ItemTemplate>
    </asp:ListView>
    </ul>
</div>

Я старался

 <ul style="list-style:none;"><li><a href='/Product/Default.aspx?id=<%# eval("ProductID") %>'>
<asp:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="Search" ServicePath="~/ProductSearch.asmx" ServiceMethod="GetProducts" MinimumPrefixLength="1" CompletionSetCount="120" EnableCaching="true" OnClientItemSelected="AutoCompleteClientMethod">
</asp:AutoCompleteExtender></a></li></ul>

но наличие расширителя автозаполнения в списке не позволяет отобразить результаты запроса.

Редактировать: Рабочий код:

    For Each dr As DataRow In myTable.Rows
        Dim id As String = dr("ProductID").ToString()
        Dim name As String = dr("ProductName").ToString()
        Dim item As String = AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(name, id)
        items.SetValue(item, i)
        i += 1
    Next

2 ответа

Решение

Смотрите эту статью или эту.

Короче говоря, создайте элементы списка, используя CreateAutoCompleteItem(), Изменить цикл в GetProducts использовать CreateAutoCompleteItem():

For Each dr As DataRow In myTable.Rows
    dim id as String = dr("ProductId").ToString()
    dim name as String = dr("ProductName").ToString()
    dim item as String = AutoCompleteExtender.CreateAutoCompleteItem(name, id)
    items.SetValue(item, i)
    i += 1
Next

Это отправляет как имя, так и идентификатор клиента. Этот шаг имеет решающее значение. (Если есть синтаксические ошибки выше, простите меня... Прошло много времени с тех пор, как я много кодировал VB - в основном C# в эти дни.)

Затем измените ваш OnClientItemSelected обработчик для использования get_key() вместо get_value() для URL:

function AutoCompleteClientMethod(source, eventArgs) {
    var value = eventArgs.get_key();
    window.location = ("/Product/Default.aspx?id=" + value)
}

Вам нужно заключить href в одинарные кавычки, например так:

<a href='/Product/Default.aspx?id=<%# eval("ProductID") %>'>

Теперь, что вы пытаетесь сделать с расширителем автозаполнения? Вы пытаетесь загрузить результаты с помощью JavaScript?

Другие вопросы по тегам