【发布时间】:2023-03-21 07:25:02
【问题描述】:
我正在尝试使用自动完成功能。 当我在 Page_Load 事件中获取我的数据库值时它可以工作,但它需要永远加载页面,因为它是我的自动完成文本字段需要可用的大量数据。 最好在用户开始输入时进行 db 查询。 我尝试了不同的方法,但都没有奏效。
这是我目前的代码;
<script type="text/javascript">
$(document).ready(function () {
SearchText();
function SearchText() {
$("#<%= artnr1.ClientID %>").autocomplete({
source: function (request, response) {
$.ajax({
url: "GetArticles.asmx/searcharticles",
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: "{ 'term' : '" + $("#<%= artnr1.ClientID %>").val() + "'}",
dataFilter: function (data) { return data; },
success: function (data) {
response($.map(data.d, function (item) {
return {
label: item.label,
value: item.value,
desc: item.desc
}
}))
//debugger;
},
error: function (result) {
alert("Error");
}
});
},
minLength: 1,
delay: 1000,
autoFocus: true,
change: function (event, ui) {
$("#<%= artben1.ClientID %>").val(ui.item.desc);//or ui.item.desc perhaps
}
}).focus(function () {
$(this).data("uiAutocomplete").search($(this).val());
});
}
});
</script>
<asp:TextBox runat="server" id="artnr1" placeholder="Artnr" value=""/>
这是我的 asmx 文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data.Odbc;
using System.Web.Configuration;
using System.Data;
using Pervasive.Data.SqlClient;
using Pervasive.Data.Common;
using Newtonsoft.Json;
namespace cDealer
{
/// <summary>
/// Summary description for GetPyART
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class GetPyART : System.Web.Services.WebService
{
[WebMethod]
public List<string> searcharticles(string term)
{
string strLagerSaldo = string.Empty;
string strLagerReserv = string.Empty;
string strLagerBest = string.Empty;
string strLagerPris = string.Empty;
string strArtKod = string.Empty;
string strEANKod = string.Empty;
string strBen = string.Empty;
string strartnrvalue = string.Empty;
string pyarticles = string.Empty;
OdbcConnection dbPyConn = new OdbcConnection(WebConfigurationManager.ConnectionStrings["ConnPyString"].ConnectionString);
string pysql = @"select D1001_Artikelkod, D1021_Benämning, D1132_Saldo, D1134_Reserverat, D1136_Beställt, D1154_Grundpris, " + (char)34 + "D1109_EAN-kod" + (char)34 + " from PULAGER WHERE D1055_Kalkyltyp <> '60' AND (D1001_Artikelkod Like '%" + term + "%' OR D1021_Benämning Like '%" + term + "%') ORDER By D1001_Artikelkod DESC";
using (OdbcConnection connection = new OdbcConnection(WebConfigurationManager.ConnectionStrings["ConnPyString"].ConnectionString))
{
OdbcCommand command = new OdbcCommand(pysql, connection);
List<string> articles = new List<string>();
connection.Open();
OdbcDataReader reader = command.ExecuteReader();
// Call Read before accessing data.
while (reader.Read())
{
if (reader.HasRows)
{
if (reader["D1132_Saldo"] != DBNull.Value)
{
strLagerSaldo = reader.GetDecimal(reader.GetOrdinal("D1132_Saldo")).ToString("G29").TrimEnd();
}
else
{
strLagerSaldo = "0";
}
if (reader["D1134_Reserverat"] != DBNull.Value)
{
strLagerReserv = reader.GetDecimal(reader.GetOrdinal("D1134_Reserverat")).ToString("G29").TrimEnd();
}
else
{
strLagerReserv = "0";
}
if (reader["D1136_Beställt"] != DBNull.Value)
{
strLagerBest = reader.GetDecimal(reader.GetOrdinal("D1136_Beställt")).ToString("G29").TrimEnd();
}
else
{
strLagerBest = "0";
}
if (reader["D1154_Grundpris"] != DBNull.Value)
{
strLagerPris = reader.GetDecimal(reader.GetOrdinal("D1154_Grundpris")).ToString("G29").TrimEnd();
strLagerPris = String.Format("{0:C}", Convert.ToDouble(strLagerPris));
}
else
{
strLagerPris = "0";
}
if (reader["D1001_Artikelkod"] != DBNull.Value)
{
strArtKod = reader.GetString(reader.GetOrdinal("D1001_Artikelkod")).TrimEnd();
}
else
{
strArtKod = "";
}
if (reader["D1021_Benämning"] != DBNull.Value)
{
strBen = reader.GetString(reader.GetOrdinal("D1021_Benämning")).TrimEnd().Replace("" + (char)34 + "", "´´");
}
else
{
strBen = "";
}
if (reader["D1109_EAN-kod"] != DBNull.Value)
{
strEANKod = reader.GetString(reader.GetOrdinal("D1109_EAN-kod")).TrimEnd();
}
else
{
strEANKod = "";
}
articles.Add("{label:" + strArtKod + " - " + strEANKod + " - " + strBen + " - L.Saldo: " + strLagerSaldo + " - Reserv.: " + strLagerReserv + " - Beställt: " + strLagerBest + " - KPris: " + strLagerPris + ", value: " + strArtKod + ", desc:" + strBen + "}");
//Response.Write(strartsearch);
}
else
{
//Response.Redirect("https://www.google.se");
}
}
// Call Close when done reading.
reader.Close();
return articles;
}
}
}
}
当我开始输入然后暂停时,事件被触发。我可以在 firebug 中看到我得到这样的 json 响应;
"[{"label":"771678 - Fuel injector/10/kw","value":"771678","desc":"Fuel injector for Ford"}]"
但没有显示自动完成功能。 我可以在调试器中看到这个错误 TypeError:无效的“in”操作数 TypeError: ui.item 为空
我不知道那在哪里,出了什么问题。任何人都可以帮助或指出一个非常简单的指南,其中包含针对 C# webforms 解释的所有位。 谢谢。
【问题讨论】:
-
JSON 中的引号似乎是错误的
"[{"label"他们必须被转义。 -
json应该怎么看?
-
转义他们
"[{\"label\":,左右。我希望这会有所帮助 -
我的响应如下所示:{"d":"[{\"label\" 但如果我查看调试器 (firefox) 中的 JSON 选项卡,我会看到:"[{"label “:”
-
我添加了你需要用来调整你的代码的代码,只有 4 行。 :D
标签: c# json jquery-ui autocomplete