0
onSelectRow: function(id){
  if(id && id!==lastSel){
    jQuery(this).restoreRow(lastSel);
    lastSel=id;
  }
  jQuery(this).editRow(id,true,null,
                       function(response, postdata){
                           var data = eval('(' + response.responseText + ')');
                           data.result.success ? alert('success') : alert('error')
                       });
}

この場合、エラーを処理できますが、この行の後にデータが復元されます。問題は、次の場合に行の復元を防ぐ方法data.result.success == falseです。

モーダルボックスで編集すれば、すべて問題ありません。しかし、インラインモードではそうではありません。

4

2 に答える 2

1

editRow関数には次のパラメーターがあります。

jQuery("#grid_id").jqGrid('editRow',rowid, keys, oneditfunc, succesfunc, url,
                          extraparam, aftersavefunc,errorfunc, afterrestorefunc);

現在のコードは使用succesfuncのみです。サーバーが400以上のHTTPステータスコードを返すことが重要です。そうすると、サーバーの応答はjQuery.ajaxとjqGridによってエラーとして解釈されます。エラーメッセージを表示したり、エラーが発生した場合のその他のアクションを表示するには、 editRow関数のerrorfuncパラメーターを使用する必要があります。

もう1つの小さな発言。の代わりに、jQuery.parseJSONを使用する必要があります。JSON.parseeval

更新:コメントからの質問にここで答えます。使用することが重要でerrorfuncあり、常にではないのはなぜsuccesfuncですか?さまざまな理由があります。ラベルシュガーの入った箱に塩を入れると、キッチンに苦い影響を与える可能性があります。の異なるコールバック関数の使用法が間違っている場合も、まったく同じですeditRow。いくつか例を挙げます。

  • エラーは、明示的にだけでなく、サーバー部分によって生成される可能性があります。Webサーバーは、SQLクエリなどの他のコードから例外をスローする可能性があります。このようなエラーをすべてキャッチした場合でも、サーバーに送信された入力データの形式が間違っていたり、その他のエラーが発生したりすると、失敗したHTTPステータスとエラーの説明を含む応答が生成される可能性があります。このようなエラー応答により、使用するフレームワーク(ASP.NET、PHPなど)のWebサーバーが生成されます。
  • jqGridで使用されるjQueryは、どのサーバー応答が成功し、どのサーバー応答がエラー応答であるかを認識している必要があります。多くの場合、エラー応答には別の形式があるため、jQuery.ajaxによって解析されません(jQueryはJSON文字列からオブジェクトに変換しません)。
  • jqGridは、応答が成功したかどうかを知ることが重要です。エラーの場合、jqGridは応答後に1つのことを実行し、成功した応答の場合は別のことを実行します。さまざまなイベントが呼び出され、さまざまなメッセージが表示されます。

エラーの処理について私が書いたのは、一般的なルールです。jqGridは、エラーが発生した場合に多くのイベントを定義します。たとえば、グリッド入力の場合はloadError すべてのタイプのフォーム編集の場合はerrorTextFormat、セル編集の場合はerrorCell、インライン編集の場合はerrorfuncです。すべての方法は、エラーが発生した場合、サーバーの応答にエラーに対応するHTTPステータスコードが含まれるという事実に基づいています(400以上)。

于 2011-01-12T11:46:36.040 に答える
1

同じシナリオを修正したかったのですが、次のようにすることができました。

$.extend($.jgrid.inlineEdit, { restoreAfterError: false });

そしてグリッドモデルでは:

ajaxRowOptions: {
    complete: function(res, stat) {
        if (res.statusText=='OK') {
            return [true, res.responseText ];
        } else {
            return [false, res.responseText ];
        }
    }
}
于 2013-09-06T08:05:59.930 に答える