创建JSON从Web服务返回"字符串"以与jquery ajax一起使用

Rob*_*ozo 3 c# ajax jquery json web-services

我尝试使用以下教程在asp.net应用程序中实现一个简单的Web服务:http://dotnetslackers.com/articles/ajax/JSON-EnabledWCFServicesInASPNET35.aspx#1301http://dotnetslackers.com/articles/ajax /Using-jQuery-with-ASP-NET.aspx

问题是,我的数据正在返回,如此屏幕截图所示(根据firebug): 替代文字

    $("#btnGet").click(function () {

        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "TimeService.svc/GetCar",
            data: "{}",
            dataType: "json",
            success: function (data) {
                alert(data.d);
            }
        });

    });

});
Run Code Online (Sandbox Code Playgroud)

我的Web服务方法如下所示:

[OperationContract]
public string GetCar()
{
    using (var sqlc = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CarTracker.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"))
    {
        sqlc.Open();
        var cmd = sqlc.CreateCommand();
        cmd.CommandText = "SELECT CarID, CarName FROM tblCars";
        using (var reader = cmd.ExecuteReader())
        {
            string sCar = "";
            int testcount = 1;
            for (int i = 0; i < testcount; i++)
            {
                reader.Read();
                sCar += reader["CarName"].ToString();
            }


            return sCar; // Car_1
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 萤火虫中的'd'来自哪里?

  2. 如何基于我的db构建'JSON-style'"字符串"以返回到jquery ajax函数?

理想情况下,我希望jquery ajax数据看起来像这样:

{"TotalCars": x, "CarList":[{"CarName":"x1", "CarID":"id1"},{"CarName":"x2", "CarID":"id2"}]} 
Run Code Online (Sandbox Code Playgroud)

那么使用jquery我可以做类似alert(data.TotalCars);的东西和所有那些东西.

请记住,我是非常新的,所以我感谢您提供的任何帮助.先感谢您!<3

jos*_*rry 6

Web服务框架使用"d"来确保服务永远不会返回裸数组.这样做是为了解决潜在的跨站点Javascript漏洞.

您希望创建描述数据协定的类,例如:

[DataContract]
public class CarCollection {
    [DataMember]
    public int TotalCars { get { return CarList.Count; }}
    [DataMember]
    public List<Car> CarList { get; set; }
}

[DataContract]
public class Car {
    [DataMember]
    public string CarName { get; set; }
    [DataMember]
    public string CarId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,您将使用这些类构建返回值.您还可以告诉WCF接受具有该WebGet属性的响应的HTTP GET方法和JSON序列化:

[OperationContract]
[WebGet(ResponseFormat=WebMessageFormat.Json)]
public string GetCar()
{
    // You will probably build this up from your databas
    var cars = new CarCollection { CarList = new List<Car>() {
        new Car { CarName = "x1", CarId = "id1" },
        new Car { CarName = "x2", CarId = "id2" },
        new Car { CarName = "x3", CarId = "id3" },
    }};

    return cars;
}
Run Code Online (Sandbox Code Playgroud)

WCF将自动将对象图序列化为JSON并将其发送回客户端.

然后,您还可以使用简化的JQuery方法get:

$("#btnGet").click(function () {
    $.get("TimeService.svc/GetCar", function(data){
        alert(data);
    });
});
Run Code Online (Sandbox Code Playgroud)