正在使用ExtJs 4.0。
我正在尝试从Web服务从数据库中获取数据并尝试在网格面板中设置但是出现以下错误 Ext.Error:无法解析服务器返回的JSON:您正在尝试解码无效JSON字符串:
extjs代码:
Ext.application({
name: 'HelloExt',
launch: function() {
// Model definition and remote store (used Ext examples data)
Ext.define('ForumThread', {
extend: 'Ext.data.Model',
fields: ['countryId', 'countryName'],
idProperty: 'countryId'
});
var store = Ext.create('Ext.data.Store', {
pageSize: 20,
model: 'ForumThread',
autoLoad: true,
proxy: {
type: 'ajax',
url: '../reports/report.asmx/display',
contentType: "application/json; charset=utf-8;",
//url: '/grid.json',
reader: {
root: 'Data',
type: 'json'
}
}
});
// Define grid that will automatically restore its selection after store reload
Ext.define('PersistantSelectionGridPanel', {
extend: 'Ext.grid.Panel'
});
// Create instance of previously defined persistant selection grid panel
var grid = Ext.create('PersistantSelectionGridPanel', {
autoscroll: true,
height: 300,
renderTo: Ext.getBody(),
//region: 'center',
store: store,
multiSelect: true, // Delete this if you only need single row selection
stateful: true,
forceFit: true,
loadMask: false,
viewConfig: {
stripeRows: true
},
columns:[{
id: 'countryId',
text: "countryId",
dataIndex: 'countryId',
flex: 1,
sortable: false
},{
text: "countryName",
dataIndex: 'countryName',
width: 70,
align: 'right',
sortable: true
} ]
});
}
});
reports.asmx
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
[Serializable]
public class report : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true, XmlSerializeString = false)]
public string display()
{
employee obj = new employee();
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize(obj.selectAll_employeeDetail(0, 0, 0));
}
}
任何人都可以建议我......我的代码中有什么问题?/
答案 0 :(得分:2)
也许是因为你写了一些奇怪的,自定义的JSON序列化,这可能是不对的(删除尾随,结束字符?为什么?)
.NET JSON序列化很简单:
JavaScriptSerializer serializer = new JavaScriptSerializer();
HttpContext.Response.Write(serializer.Serialize(Object));
HttpContext.Response.ContentType = "application/json";
您必须将[Serializable]属性添加到类或使用已具有该属性的.NET类型。
您要返回的字符串必须是无效的JSON。
[编辑] 奇怪的是:Asmx服务(可能是WCF服务,因为我从微软AJAX脚本中反转了工程解决方案)不寻找'Accept'标头来定义响应类型,因为它应该导致RFC的http: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
Accept request-header字段可用于指定响应可接受的某些媒体类型。
所以这应该足够了但是jQuery.ajax却不行。从我上面提到的AJAX脚本中我得到了标题Content-Type:
“Content-Type”:“application / json; charset = utf-8”
这个jQuery工作得很好。所以我想你必须添加这个标题来请求,这应该工作。奇怪的是[ScriptMethod]属性没有将JSON的默认响应设置为状态http://msdn.microsoft.com/en-us/library/system.web.script.services.scriptmethodattribute.aspx:
指定响应是序列化为JSON还是XML。默认是Json。 您还必须通过此标头强制服务作为脚本服务工作:
http://en.wikipedia.org/wiki/List_of_HTTP_header_fields:
Content-Type请求正文的MIME类型(与POST和PUT请求一起使用)
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html:
Content-Type entity-header字段指示发送给收件人的实体主体的媒体类型
所以我想微软的人会这样做:“如果你不发送JSON,我们也不会发送给你。” :)
我希望这会奏效。
PS:因为这是json服务,如果你返回.NET内置类型或你的类型[Serializable]属性,你可以返回它。无需预先序列化将被序列化的响应。