为动态表单指定FormPanel.form.load的根节点

时间:2009-01-24 13:00:35

标签: asp.net web-services json extjs

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

2 个答案:

答案 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对象。