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

我尝试使用以下教程在asp.net应用程序中实现一个简单的Web服务: http : //dotnetslackers.com/articles/ajax/JSON-EnabledWCFServicesInASPNET35.aspx#1301和http://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); } }); }); }); 

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

所以我的问题是:

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

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

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

 {"TotalCars": x, "CarList":[{"CarName":"x1", "CarID":"id1"},{"CarName":"x2", "CarID":"id2"}]} 

那么使用jquery我可以做一些事情,比如alert(data.TotalCars); 所有这些东西。

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

Web服务框架使用“d”来确保服务永远不会返回裸数组。 这样做是为了解决潜在的跨站点Javascript攻击 。

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

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

然后,您将使用这些类构建返回值。 您还可以告诉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() { new Car { CarName = "x1", CarId = "id1" }, new Car { CarName = "x2", CarId = "id2" }, new Car { CarName = "x3", CarId = "id3" }, }}; return cars; } 

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

您也可以使用简化的JQuery方法get

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

1)JSON响应中的’d’由ASP.Net输入,以防止服务返回有效的javascript语句,因此无法将其解析并实例化为javascript中的新对象以防止跨站点脚本攻击。

2)如果使用[ScriptMethod(UseHttpGet=true, ResponseFormat=ResponseFormat.Json)]注释Web方法,web服务将自动将.Net对象转换为JSON。 使用@joshperry的CarCollection,尝试:

 [WebMethod()] [ScriptMethod(UseHttpGet=true, ResponseFormat=ResponseFormat.Json)] public CarCollection GetCars() { CarCollection carResult = new CarCollection(); ... return carResult; }