Typeahead.js 和 Bloodhound.js 与 C# WebForms WebMethod 的集成

Posted

技术标签:

【中文标题】Typeahead.js 和 Bloodhound.js 与 C# WebForms WebMethod 的集成【英文标题】:Typeahead.js and Bloodhound.js integration with C# WebForms WebMethod 【发布时间】:2014-10-08 05:21:28 【问题描述】:

我正在尝试在 C# 中实现一个简单的WebMethod 来搜索 50,000 人的数据库。我正在使用 Twitter Bootstrap bloodhound.jstypeahead.js 来标记和自动完成回复。

当我运行此代码时,预先输入会显示一个带有undefined 的下拉菜单。

如何正确处理 JSON 响应以去除 .NET WebMethod 返回的 d 对象并将我的记录正确传递给 Bloodhound?我已经使用 jQuery 的 $.ajax 提供的 dataFilter 方法尝试过这个,但它不适合我。

C# WebMethod:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static object searchStaffByName(string q)

    using (App_Data.DQDBDataContext dc = new App_Data.DQDBDataContext())
    
        var results = dc.getStaffDetails(q).ToList();
        return new  Status = "OK", Records = results, Count = results.Count ; 
    

Typeahead JS 实现:

var textlookup = new Bloodhound(
    datumTokenizer: function (d) 
        return Bloodhound.tokenizers.whitespace(d.val);
    ,
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: 
        url: 'Search.aspx/searchStaffByName',
        replace: function (url, query) 
            searchQuery = query;
            return url;
        ,
        ajax: 
            beforeSend: function (jqXhr, settings) 
                settings.data = JSON.stringify(
                    q: searchQuery
                );
                jqXhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
            ,
            dataFilter: function (data, type) 
                if (type === "json") 
                    data = $.parseJSON(data);
                    if (typeof data.d === 'object' && data.d.Count > 0) 
                        return data.d.Records;
                    
                
            ,
            type: 'POST'
        
    
);

textlookup.initialize();

$('.autocomplete').typeahead(
    hint: true,
    highlight: true,
    minLength: 3
,

    name: 'textlookup',
    displayKey: 'Forename',
    source: textlookup.ttAdapter()
);

示例 JSON 响应:


    "d": 
        "Status":"OK",
        "Records": [
            "id":45711192,
            "phone":"514-579-5721",
            "Forename":"Jayden",
            "Surname":"Adams",
            "DOB":"\/Date(990226800000)\/"
        ,
        
            "id":12603644,
            "phone":"333-143-9094",
            "Forename":"Jake",
            "Surname":"Adams",
            "DOB":"\/Date(43542000000)\/"
        ,
        
            "id":68196438,
            "phone":"440-505-2403",
            "Forename":"Josh",
            "Surname":"Adams",
            "DOB":"\/Date(-51152400000)\/"
        ],
        "Count":6
    

【问题讨论】:

我会在解析后仔细检查 data 实际上是什么,然后确保您进入了 if 块。 【参考方案1】:

如果您的预输入数据将位于 name: 'textlookup', 数组中,请先使用您的 JSON 响应填充该数组。以下假设数据是 JSON。

textlookup = [];
    for (var i = 0; i < data.d.Records.length; i += 1) 
       textlookup.push(data.d.Records[i].Forename);

这应该将每个Forename 推入数组textlookup。您将收到未定义的错误,因为您将对象放入数组中。

【讨论】:

【参考方案2】:

我花了一些时间,发现最好返回一个字符串数组。 这是我的网络方法。

    [WebMethod]
    public static string[] MemberLookup(string MbrFullName)
    

        DataSet ds = (dataset provider goes here)

        List<string> members = new List<string>();

        foreach(DataRow dr in ds.Tables[0].Rows)
         members.Add(string.Format("0-1", dr["label"].ToString(), dr["value"].ToString())); 
        return members.ToArray();
    

【讨论】:

以上是关于Typeahead.js 和 Bloodhound.js 与 C# WebForms WebMethod 的集成的主要内容,如果未能解决你的问题,请参考以下文章

typeahead.js:返回空查询的所有 Bloodhound 记录

Typeahead.js / Bloodhound 只显示一个结果 [重复]

typeahead.js 不返回所有结果

在 Angular 2 中使用 typeahead.js

我可以更改 Typeahead.js 中的模板引擎吗?

使用 Twitter Typeahead.js 的多个远程源