我有一个包含一种方法的Web服务:
[WebMethod] public string Movies() { using (var dataContext = new MovieCollectionDataContext()) { var query = dataContext.Movies.Select(m =>new{m.Title,m.ReleaseDate}).Take(20); var serializer = new JavaScriptSerializer(); return serializer.Serialize(query); } }
该方法正确地序列化了对象,但是当我在FireBug中查看响应时,它看起来像这样:
<?xml version="1.0" encoding="utf-8"?> <string xmlns="http://tempuri.org/">[{"Title":"sql","ReleaseDate":"\/Date(1224007200000)\/"},{"Title":"Termonator Salvation","ReleaseDate":"\/Date(1224007200000)\/"}]</string>
这是我使用Kendo Data Source的jQuery方法
$(function () { alert("Welcome To Kendo"); var dataSource = new kendo.data.DataSource( { transport: { read: { type: "POST",dataType: "json",url: "/MovieService.asmx/Movies" // contentType: "application/json; charset=utf-8" } },change: function (e) { alert(e); },error: function (e) { alert(e[2]); },pageSize: 10,schema: { data: "d" } }); $("#MovieGridView").kendoGrid({ dataSource: dataSource,height: 250,scrollable: true,sortable: true,pageable: true,columns: [ { field: "Title",title: "Movie Name" },{ field: "ReleaseDate",title: "Movie Release" } ],editable: "popup",toolbar: ["create"] }); });
上面的代码显示了我在jQuery中所做的事情以及错误事件调用时我得到了这个错误
SyntaxError: JSON.parse: unexpected character
如何将上述数据转换为JSON,以便在jQuery中使用它?我哪里错了?
解决方法
您需要指定方法的
ResponseFormat
:
[WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public string GetMovies() { }
注意:为了解决类似问题的其他人,同样重要的是要注意您应该使用POST请求,而不是GET请求.见:JSON Hijacking and How ASP.NET AJAX 1.0 Avoids these Attacks
编辑
基于您发布的jQuery,您没有调用正确的方法.你C#定义了一个名为GetMovies的方法,但你的jQuery正试图调用一个名为`Movies’的方法.
这个:
url: "/MovieService.asmx/Movies"
应改为:
url: "/MovieService.asmx/GetMovies"