【问题标题】:Json Data not loading in jqGrid with spring 3 mvcJson 数据未使用 spring 3 mvc 在 jqGrid 中加载
【发布时间】:2010-12-09 23:18:12
【问题描述】:

单击按钮时,我正在尝试使用 json datadtype 加载 jqgrid。 我尝试了很多方法来加载数据,但它失败并显示空网格。 请告知我在这里缺少什么。

我的网格

$("#bedata").click(function(){
    jQuery("#list2").jqGrid({
        url:'/mso/interop/interopcompanycfg/getDSAccounts?companyId=${interopcompcfg.company.id}',
      datatype: "json",
        mtype: 'GET',
        colNames:['Id','DTCCID','COMPANYID','DTCCACCOUNTID'],         
        colModel:[
         {name:'ID',index:'id', sortable:true, align:'center',width:90},
         {name:'DTCCID',index:'dsId', sortable:true, align:'center',width:90},
         {name:'COMPANYID',index:'companyId',sortable:true, align:'center', width:120},
         {name:'DTCCACCOUNTID',index:'dsLegalEntityId', sortable:true, align:'center',width:130}      
        ],
        rowNum:10,
        rowList:[10,20,30],
        pager: '#pager2',
        sortname: 'dsId',
        viewrecords: true,
        sortorder: "desc",
        caption:"DS ACCOUNTS",
        jsonReader: {
      repeatitems : false,    
      root:"rows",
      cell: "",
      id: "0"
      } 
    });
  jQuery("#list2").jqGrid('navGrid','#pager2',{edit:true,add:true,del:true});
 });


spring requestmapping
@RequestMapping(value="/getDSAccounts",method= RequestMethod.GET) 
 public @ResponseBody  List<Vector<String>> getDSAccountsJSON(HttpServletRequest request,HttpServletResponse httpResponse) {
  try{

   UsersJsonDTO usersJsonDTO = new UsersJsonDTO(); 
      usersJsonDTO.setPage("1");   
   usersJsonDTO.setRecords("8");     
   usersJsonDTO.setTotal("20");

   Company cmp=(Company) request.getSession().getAttribute("company"); 
   List<DSAccounts> message = interopService.getDSAccounts(cmp);  

   httpResponse.setContentType("text/javascript");
   int i=0;
   List<DTCCAccounts> rowJsonList = new ArrayList<DTCCAccounts>();   
    for (DSAccounts dsAccountDTO:message)
    {   
    DTCCAccounts rowJson = new DTCCAccounts();       
    rowJson.setId(String.valueOf(i+1));
    rowJson.setDsId(String.valueOf(dsAccountDTO.getDsId()));
    rowJson.setCompanyId(String.valueOf(dsAccountDTO.getCompany().getId()));
    rowJson.setDsLegalEntityId(dsAccountDTO.getDsLegalEntityId());
    rowJsonList.add(rowJson);
    } 

   usersJsonDTO.setRows(rowJsonList);
      return usersJsonDTO;

【问题讨论】:

  • 您能否发布您的 JSON 以便我们对其进行验证?您也可以使用jsonlint.com 自行验证
  • 我在 jsonlimt.com 中进行了验证,Json 是有效的。 {“页面”:“1”,“记录”:“8”,“行”:[{“companyId”:“1661”,“dsId”:“72”,“dsLegalEntityId”:“SELLSIDE01”,“id” :“1”},{“companyId”:“1661”,“dsId”:“74”,“dsLegalEntityId”:“SELLSIDE03”,“id”:“1”}],“total”:“20”}
  • 我怀疑 colModel 中的 jsonmapping 导致了问题..但是没有任何可用的文档或示例。提示或支持链接会很有帮助

标签: jquery json jqgrid


【解决方案1】:

尝试显式设置 jsonReader 的所有属性。像这样

jsonReader : {
      root: "rows",
      page: "page",
      total: "total",
      records: "records",
      repeatitems: false,
      cell: "cell",
      id: "id"
}

你拥有的是这样的:

jsonReader: {
  repeatitems : false,    
  root:"rows",
  cell: "",
  id: "0"
} 

为什么id设置为0? jqGrid 如何从您的 JSON 数据中知道 id 是什么?另外,为什么要删除 totalpagecell 属性?

我从 Spring MVC 3 应用程序返回的 JSON 格式如下:

{
"total":"10",
"page":"1",
"records":"3",
"rows":[{"id":1,"firstName":"John","lastName":"Smith"},
    {"id":2,"firstName":"Jane","lastName":"Adams"},
    {"id":3,"firstName":"Jeff","lastName":"Mayer"}]

}

另外,我注意到你做了以下事情:

 httpResponse.setContentType("text/javascript");

我不必在我的 Spring 3 MVC 中这样做。查看我在http://krams915.blogspot.com/2010/12/jqgrid-and-spring-3-mvc-integration.html写的这个教程

【讨论】:

  • 抱歉,我们只需要包含jsonReador 的属性,这些属性不同于默认设置。在 jqGrid 文档中trirand.com/jqgridwiki/… 也描述了id:"0" 的含义。是正确的设置。可以在 ID 列定义中获得相同的结果,包括 key:true。您编写的教程看起来很有趣,但是 jqGrid 允许不同的数据序列化方式。只需使用相应的jsonReader,有时还需要使用额外的jsonmap 选项。
  • 有趣。我现在刚试过。我删除了所有属性。事实证明,您只需要 jsonReader 中的 repeatitems: false 属性。原来 jqGrid 有一个内部字段名称约定。如果您的 JSON 响应没有使用“rows”作为根名称,那么您必须显式声明根属性。
  • @Oleg,你是对的。如果您遵循 jqGrid 命名约定,则不需要它。在 Sabari(提出问题的人)的情况下,他的 JSON 似乎可以接受。也许问题出在他的春天。我怀疑 contentType.
  • 不,在这种情况下,它只是我在回答中描述的列的名称。更改名称后将显示数据:ok-soft-gmbh.com/jqGrid/Sabari0.htm。下一个小问题是双重身份。更改后,网格将正确移位ok-soft-gmbh.com/jqGrid/Sabari.htm
  • @Oleg,已验证。我玩了我的 jqGrid-Spring 3 应用程序。我像 Sabari 那样设置 contentType。它没有弄乱数据的加载。然后我尝试将 colModel 名称的大小写更改为全部大写,它搞砸了数据的加载。换句话说,colModel 名称必须与 JSON 数据中的 JSON 名称完全匹配,包括大小写。
【解决方案2】:

如果您的 JSON 数据包含类似的元素

{
    "page": "1",
    "records": "8",
    "rows": [
        {
            "companyId": "1661",
            "dsId": "72",
            "dsLegalEntityId": "SELLSIDE01",
            "id": "1" 
        },
        {
            "companyId": "1661",
            "dsId": "74",
            "dsLegalEntityId": "SELLSIDE03",
            "id": "1" 
        } 
    ],
    "total": "20" 
}

您应该将所有列的name 属性更改为您当前用于index 的值,网格将被数据填充。

您的数据中还存在一个问题:您有两个具有相同 id 的元素。因此,如果您要选择第二行,则将选择第一行。因此,您应该选择“dsId”作为 id 或生成具有唯一 id 的数据。

更新:Here 是相同的代码,其中只有名称是固定的,here 是相同的网格,其中 id 也是固定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 2014-04-22
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多