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

时间:2014-08-14 14:03:26

标签: c# javascript jquery twitter-bootstrap bootstrap-typeahead

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

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

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

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

2 个答案:

答案 0 :(得分: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中。您将获得未定义的错误,因为您将对象放入数组中。

答案 1 :(得分:1)

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

    [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();
    }