获取ProductID的Javascript代码?

时间:2011-09-08 19:15:35

标签: javascript asp.net web-services autocomplete autocompleteextender

我有一个获得ProductName的Web服务,我需要从AutoExtender中下载的产品作为每个产品的单个页面的链接。 现在,URL填充了ProductName,而不是ID:

Default.aspx?id=Test%20Product

需要

Default.aspx?id=519

*注意 - 此网站仅供内部使用,因此我们不担心现在被黑客入侵。我们希望该网站能够正常运作。

有人告诉我,我想做的事情是asp.net论坛上的人不可能做到的,所以我来到这里希望得到一些帮助。我认为是从webservice获取ProductName的javascript,我需要它来获取ProductID。我尝试重写For Each循环以包含ProductID而不是ProductName,但AutoCompleteExtender仅在结果中显示ID而不是ProductNames。

使用Javascript:

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

以下是我的autoCompleteExtender和webservice的代码:

<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之前显示的方式。我试图把它融入我现在所拥有的东西中,但我无法正常工作。请注意,这是 OLD 代码,上面的 是我现在使用的所有代码。

<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 个答案:

答案 0 :(得分:1)

请参阅this articlethis one

简而言之,使用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

将名称和ID都发送给客户端。这一步至关重要。 (如果上面有语法错误,请原谅我......自从我编写了很多VB以来,已经有很长一段时间了 - 这些日子主要是C#。)

然后修改您的OnClientItemSelected处理程序,使用get_key()代替get_value()作为网址:

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

答案 1 :(得分:0)

你需要用单引号包装href,如下所示:

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

现在,你想用自动完成扩展程序做什么?您是否尝试使用JavaScript加载结果?