1

我正在构建一个基于从 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”作为根节点?

4

2 回答 2

2

经过更多测试后,我发现 ExtJS 表单确实从我的 Web 服务加载了 JSON,但是因为响应文本在根目录中没有 "success": true 它由 "failed" 处理程序处理。幸运的是,此处理程序接受与“成功”处理程序相同的参数,因此可以进行相同的操作。

这是我的表单加载处理程序的示例:

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
    }
  }
});
于 2009-01-25T10:06:31.903 回答
1

当然,您不必调用 form.load() 。我绕过它,直接通过调用 ScriptManager 提供的链接到我的 web 方法的 AJAX 函数来调用我的 ASMX web 方法。MS AJAX 完成所有 JSON 解码,并排除 'd' 属性等。

您的 Web 方法甚至不必按照 form.load() 的要求返回带有“成功”和“数据”对象的对象,尽管它是一种有用的格式并且我坚持使用它。

通过 web 方法返回的“数据”对象(使用名称/值对,其中名称 == 字段名称),您现在可以调用 ExtJs 的 form.setValues(data); 将值写入字段。

这是绕过 ExtJS 代码的一个完全有效的案例。

--

与加载一样,提交也是如此。要解决必须由提交 Web 方法返回的对象中的“d”属性问题,请处理提交按钮的单击事件,并通过直接调用您的 Web 方法将数据推送到服务器。您的 web 方法可以/应该返回与 ExtJs 所需格式相同的对象。但是你取回了这个对象,如果不成功,你自己调用 form.markInvalid() ,传入'errors'属性。Peasy很容易,效果很好。

同样,由于 ExtJs 不能很好地使用 'd' 属性,因此绕过它并自己做事是完全有效的。

--

我越来越倾向于使用 ScriptManager 提供的函数来调用我的 web 方法,并绕过 ExtJs 的 AJAX 方法调用代码。前者更易于使用,了解“d”属性,还知道如何反序列化 Microsoft 的 JSON 格式以用于序列化的 DateTime 对象。

于 2009-04-30T15:55:12.587 回答