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() で要求されるように、'success' オブジェクトと 'data' オブジェクトを含むオブジェクトを返す必要さえありませんが、これは便利な形式であり、私はそれに固執しています。

Web メソッドによって返された「データ」オブジェクト (名前と値のペア、名前 == フィールド名) を使用して、ExtJs の form.setValues(data); を呼び出すことができます。フィールドに値を書き込みます。

これは、ExtJS のコードをバイパスするための完全に有効なケースです。

--

読み込みと同様に、送信も同様です。送信 Web メソッドによって返される必要があるオブジェクトの 'd' プロパティの問題を回避するには、[送信] ボタンのクリック イベントを処理し、Web メソッドを直接呼び出してデータをサーバーにプッシュします。Web メソッドは、ExtJ で必要とされるのと同じ形式でオブジェクトを返すことができます/返す必要があります。しかし、このオブジェクトを取得し、成功しなかった場合は自分で form.markInvalid() を呼び出して、'errors' プロパティを渡します。簡単でうまく機能します。

繰り返しますが、ExtJs は 'd' プロパティをうまく処理できないため、これをバイパスして自分で処理することは完全に有効です。

--

私は、Web メソッドを呼び出すために ScriptManager が提供する関数をますます使用し、コードを呼び出す ExtJs の AJAX メソッドをバイパスする傾向があります。前者は使い方がはるかに簡単で、「d」プロパティについて知っており、シリアル化された DateTime オブジェクトの Microsoft の JSON 形式を逆シリアル化する方法も知っています。

于 2009-04-30T15:55:12.587 に答える