将数据从C#返回到jQuery UI自动完成

时间:2014-05-06 08:08:41

标签: c# jquery ajax asp.net-mvc jquery-ui

我想用数据库中的数据填充autocomplete。 所以我在c#中编写了一个方法来从db:

中读取它
public string[] GetNames()
{
    var names = unitOfWork.deviceRepository.Get().Select(w=>w.Name);
    return names.ToArray();
}

这很好用。所有需要的数据都是名称。

现在我正在使用Ajax将这些数据提供给客户端:

$(function () {
    var availableTags;
    $.ajax({
        url: "/DeviceUsage/GetNames",
        type: "GET",
        error: function (data) {
            alert("wystąpił nieokreślony błąd " + data);
        },
        success: function (data) {
            console.log(data);
            availableTags = data;
        }
    })
    $("#deviceName").autocomplete({
        source: availableTags
    });
});

您可以看到我离开dataType进行智能猜测。 但是console.log成功地在控制台中写入System.String[]而不是来自GetNames的数据。 任何人都可以建议我如何修改我的代码以使自动完成工作?

2 个答案:

答案 0 :(得分:3)

dataType不适用于C#或MVC或服务器端,这是告诉jQuery您正在使用json响应并且jQuery应该解析它。由于您没有提供它,jQuery不会解析它,因此数据只是一个字符串。如果你想要json,那么提供它或使用JSON.parse来解析你的数据字符串。

要么 -

$.ajax({
        url: "/DeviceUsage/GetNames",
        type: "GET",
        dataType: "json",
        error: function (data) {
            alert("wystąpił nieokreślony błąd " + data);
        },
        success: function (data) {
            console.log(data);
            availableTags = data;
        }
    })

或 -

$.ajax({
        url: "/DeviceUsage/GetNames",
        type: "GET",
        error: function (data) {
            alert("wystąpił nieokreślony błąd " + data);
        },
        success: function (data) {
            var jsonData = JSON.parse(data);
            console.log(jsonData);
            availableTags = jsonData;
        }
    })

而且,在分配之前,你不是在等待ajax完成 -

$("#deviceName").autocomplete({
        source: availableTags
    });

你应该等待ajax完成,所以把这个电话转到这样的成功 -

success: function (data) {
            //do proper parsing as mentioned earlier
            availableTags = jsonData;
            $("#deviceName").autocomplete({
                 source: availableTags
             }); 
        }

因为在通话时availableTags中没有任何内容。

答案 1 :(得分:1)

如果您只是希望以逗号分隔的字符串作为返回值,则可以更改GetNames函数以返回string并使用String.Join函数连接数组。

return String.Join(", ", unitOfWork.deviceRepository.Get().Select(w=>w.Name).ToArray());

但我个人建议使用某种类型的json值响应并返回一个字符串数组作为json string(由JavaScript轻松解析)。

类似的东西(使用newtonsoft json.net,未测试以下示例):

return JsonConvert.SerializeObject(unitOfWork.deviceRepository.Get().Select(w=>w.Name).ToArray());