1

こんにちは、jqGrid の初心者です。jqGrid 4.4 を使用しています。私はOlegによるアプローチをうまく使用しました

クライアントのみでモーダル フォームを使用して jqGrid に新しい行を追加する

行をローカルに追加します。私が直面している2つの問題があります

  1. 最後に追加されていない行、どうすればこれを達成できますか?
  2. 以下のように、ボタンをクリックするとすべての行が送信されます。

エラーブロックで常にアラートを受け取りますか?

    $("#sendButton").click(function(){
    var gridData = jQuery("#list").getRowData();
    var myJSONString = JSON.stringify(gridData);             
    var postData = myJSONString.replace(/[\"]/g, '\"');     
    alert("JSON serialized jqGrid data:\n" + postData);
    $.ajax({
        type: "POST",
        url: CONTEXT_ROOT+"/json",
        data : postData,
        dataType:"json",
        contentType: "application/json; charset=utf-8",
        success: function(response, textStatus, xhr) {
            alert("success");
        },
        error: function(xhr, textStatus, errorThrown) {
            alert("error:"+errorThrown+" textStatus : "+textStatus);
        }           
    });
});

Javaコントローラーに保存したら、何を返す必要があるのか​​ わかりません。これがコントローラーのコードです。私も戻り値を無効にしてみましたが、同じ結果になりました。また、jsp からの json オブジェクトのリストをドメイン オブジェクトのリストにバインドするためのより良い方法があります。で説明されているように、 @RequestBody を使用してフォームからのようなオブジェクトが 1 つしかない場合に Binding を試しました

http://blog.springsource.org/2010/01/25/ajax-simplifications-in-spring-3-0/

@RequestMapping(value = "/json", method = RequestMethod.POST)
public ModelAndView saveNewCasePackOptions(@RequestBody List<Map> json) {

    for(Map mJson : json){  
        String idCasePkOptions = (String)mJson.get("idCasePackOptions");            
        Long idCasePackOptions = (idCasePkOptions.isEmpty())?null:new Long(idCasePkOptions);
        Short cypharecommended =  new Short((String)mJson.get("cypharecommended"));
        Short distributorapproved = new Short((String)mJson.get("distributorapproved"));
        String heightStr = (String)mJson.get("height");
        Double height = (heightStr.isEmpty())?null:new Double(heightStr);

        String lengthStr = (String)mJson.get("length");
        Double length = (lengthStr.isEmpty())?null:new Double(lengthStr);

        String weightStr = (String)mJson.get("height");
        Double weight = (weightStr.isEmpty())?null:new Double(weightStr);

        String widthStr = (String)mJson.get("width");
        Double width = (widthStr.isEmpty())?null:new Double(widthStr);      

        String stateString = (String)mJson.get("statuscode");
        stateString = (stateString.contains("Green"))?"1":"0";          
        Short statuscode = new Short(stateString);

        CasePackOptions casePkOpt = new CasePackOptions(idCasePackOptions, cypharecommended, distributorapproved, height, length, statuscode, weight, width);  

        System.out.println(casePkOpt);

        casePackOptionsService.save(casePkOpt);
    }
    ModelAndView mav = new ModelAndView();      
    mav.setViewName("casepackoptions/listPage1.jsp");
    return mav;
}

どんな助けでも大歓迎です。

4

2 に答える 2

1

私はあなたの質問の最初の部分に答えをここに書きました。

質問の2番目の部分の答えは、Springを使用した人々から受け取ることができます。その部分myJSONString.replace(/[\"]/g, '\"')は私には非常に疑わしいようです。data : {json: postData}おそらく、の代わりにを使用する必要がありますdata : postData。おそらく、またはに変更@RequestBodyする必要があります。私はSpringを自分で使用していません。@RequestParam@RequestParam("json")

$("#list").jqGrid("getGridParam", "data")さらに、の代わりに使用できますjQuery("#list").getRowData()。データのローカルページングを使用する場合は特に役立ちます。

于 2012-09-07T16:26:26.467 に答える
0

私はそれを機能させましたが、これが推奨される方法であるかどうかはよくわかりません。

javaスクリプト関数は

$("#sendButton").click(function(){
    var gridData = jQuery("#list").getRowData();
    gridData = JSON.stringify(gridData);    
    alert("postData stringify data :\n" + postData);
    postData = postData.replace();
    $.ajax({
        type: "POST",
        url: CONTEXT_ROOT+"/json",
        data : gridData,
        contentType: "application/json; charset=utf-8",
        success: function(response, textStatus, xhr) {
            alert("success");
        },
        error: function(xhr, textStatus, errorThrown) {             
            alert("error:"+errorThrown+" textStatus : "+textStatus);
        }           
    });
});

サーバーコードは現在

@RequestMapping(value = "/json", method = RequestMethod.POST)
public @ResponseBody String saveNewCasePackOptions(@RequestBody List<Map> json) {
    for(Map mJson : json){  
        String idCasePkOptions = (String)mJson.get("idCasePackOptions");            
        Long idCasePackOptions = (idCasePkOptions.isEmpty())?null:new Long(idCasePkOptions);
        Short cypharecommended =  new Short((String)mJson.get("cypharecommended"));
        Short distributorapproved = new Short((String)mJson.get("distributorapproved"));
        String heightStr = (String)mJson.get("height");
        Double height = (heightStr.isEmpty())?null:new Double(heightStr);

        String lengthStr = (String)mJson.get("length");
        Double length = (lengthStr.isEmpty())?null:new Double(lengthStr);

        String weightStr = (String)mJson.get("height");
        Double weight = (weightStr.isEmpty())?null:new Double(weightStr);

        String widthStr = (String)mJson.get("width");
        Double width = (widthStr.isEmpty())?null:new Double(widthStr);      

        String stateString = (String)mJson.get("statuscode");           
        Short statuscode = new Short(stateString);

        CasePackOptions casePkOpt = new CasePackOptions(idCasePackOptions, cypharecommended, distributorapproved, height, length, statuscode, weight, width);  

        System.out.println(casePkOpt);

        casePackOptionsService.save(casePkOpt);
    }
    return "Success";
}

別の方法で行う必要があると感じること

  1. $( "#list")。jqGrid( "getGridParam"、 "data");を使おうとすると jQuery( "#list")。getRowData();の代わりに Json文字列の一部としてid:"1"を取得していました
  2. data:postDataの代わりにdata:{json:postData}を使用しようとすると、firebugのjsonオブジェクトは次のようにエンコードされました

json =%5B%7B%22idCasePackOptions%22%3A%221%22%2C%22cypharecommended%22%3A%221%22%2C%22distributorauthorized%22%3A%222%22%2C%22height%22%3A%2214 %22%2C%22length%22%3A%2255%22%2C%22statuscode%22%3A%221%22%2C%22weight%22%3A%2214%22%2C%22width%22%3A%221%22 %7D%2C

どんな提案も役に立ちます。ありがとう

于 2012-09-10T04:33:33.990 に答える