我正在构建一个基于从ASP.NET Web服务加载的JSON数据的动态ExtJS表单。我发现的问题是ExtJS需要特定格式的JSON,即。
{ "metaData": { "title": "Testing" }, "data": [], "success": true }
当使用ASP.NET Web服务将对象作为JSON返回时,它返回第一个元素“d”,即
{ "d": { "metaData": { "title": "Testing" }, "data": [], "success": true } }
是否可以告诉ExtJS表单使用“d”作为根节点?
答案 0 :(得分:2)
经过一些测试后,我发现ExtJS表单确实从我的Web服务加载了JSON,但因为响应文本没有“成功”:在root中它是由'failed'处理程序处理的。幸运的是,这个处理程序接受与'success'处理程序相同的参数,因此可以操作相同的参数。
以下是我的表单加载处理程序的示例:
this.form.load({
url: "myservice.asmx/getUser",
headers: {'Content-Type': 'application/json'},
success: function(form, action) {
//not fired
},
failure: function(form, action){
if (action.result.d){
//process data
}
}
});
答案 1 :(得分:1)
您当然不必调用form.load()。我绕过它,直接通过调用链接到我的webmethod的AJAX函数直接调用我的ASMX Web方法,如ScriptManager所提供的。 MS AJAX执行所有JSON解码,并将'd'属性等因素排除在外。
你的web方法甚至不需要像form.load()那样返回带有'success'和'data'对象的对象,虽然它是一种有用的格式,我坚持使用它。
使用web方法返回的'data'对象(带名称/值对,其中name == field name),您现在可以调用ExtJs的form.setValues(data);将值写入字段。
这是绕过ExtJS代码的完全有效的案例。
-
与加载一样,提交也是如此。要解决必须由提交Web方法返回的对象中的“d”属性问题,请处理“提交”按钮的单击事件,并通过直接调用Web方法将数据推送到服务器。您的Web方法可以/应该返回与ExtJs所需格式相同的对象。但是你得到了这个对象,如果不成功,请自己调用form.markInvalid(),传入'errors'属性。 Peasy容易且效果很好。
同样,由于ExtJs与'd'属性不匹配,因此绕过它并自行完成是完全有效的。
-
我倾向于使用ScriptManager提供的函数来越来越多地调用我的Web方法,并绕过ExtJs的AJAX方法调用代码。前者更易于使用,了解'd'属性,也知道如何反序列化Microsoft JSON格式的序列化DateTime对象。