2

ProductName を取得する Web サービスがあり、AutoExtender からドロップダウンされた製品が各製品の個々のページへのリンクである必要があります。現在、URL は ID ではなく ProductName で埋められます。

Default.aspx?id=Test%20Product

する必要があります

Default.aspx?id=519

*注 - このサイトは内部使用のみであるため、現時点でハッキングされる心配はありません。私たちはサイトが機能することを望んでいます。

asp.net のフォーラムで、私がやりたいことは不可能だと言われたので、助けを求めてここに来ました。Web サービスから ProductName を取得しているのは JavaScript だと思いますが、ProductID を取得するには JavaScript が必要です。ProductName の代わりに ProductID を含めるように For Each ループを書き直そうとしましたが、AutoCompleteExtender は ProductNames ではなく ID のみを結果に表示します。

Javascript:

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

私のautoCompleteExtenderとWebサービスのコードは次のとおりです。

<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
4

2 に答える 2

1

この記事またはこれを参照してください。

つまり、を使用してリスト項目を作成します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ハンドラーを変更して、URL のget_key()代わりに使用します。get_value()

function AutoCompleteClientMethod(source, eventArgs) {
    var value = eventArgs.get_key();
    window.location = ("/Product/Default.aspx?id=" + value)
}
于 2011-09-08T19:58:54.063 に答える
0

次のように、href を一重引用符で囲む必要があります。

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

さて、オートコンプリート エクステンダーで何をしようとしているのでしょうか。JavaScript で結果を読み込もうとしていますか?

于 2011-09-08T20:00:56.070 に答える