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 控制器中后需要返回什么。这是控制器中的代码。我也尝试将返回作为 void 但结果相同。还有一种更好的方法可以将来自 jsp 的 json 对象列表绑定到域对象列表。当只有一个对象(例如使用 @RequestBody 的表单中的对象)时,我尝试过 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

我在这里写了你问题第一部分的答案。

您可以从使用 Spring 的人那里得到问题第二部分的答案。这部分myJSONString.replace(/[\"]/g, '\"')对我来说似乎很可疑。可能您需要使用data : {json: postData}而不是data : postData. 可能您需要更改@RequestBody@RequestParam@RequestParam("json")。我自己不使用 Spring。

此外,您可以使用$("#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(); 我得到 id:"1" 作为我的 Json 字符串的一部分
  2. 当尝试使用 data : {json: postData} 而不是 data : postData 时,firebug 中的 json 对象编码如下

json=%5B%7B%22idCasePackOptions%22%3A%221%22%2C%22cypharecommended%22%3A%221%22%2C%22distributorapproved%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 回答