【问题标题】:JqGrid addJSONData + ASP.NET 2.0 WSJqG​​rid addJSONData + ASP.NET 2.0 WS
【发布时间】:2010-10-07 10:32:29
【问题描述】:

我有点失落。我尝试实现基于 JqGrid 的解决方案,并尝试将函数用作数据类型。我猜我已经按照这本书设置了所有内容,我调用了 WS 并返回了 JSON,我在 ajax 调用中在客户端取得了成功,我使用addJSONData“绑定”了 jqGrid,但网格仍然为空。我现在没有任何线索......同一页面上的其他“本地”样本可以正常工作(jsonstring ...)

我的 WS 方法如下:

[WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetGridData()  
         {  
             // Load a list 
             InitSessionVariables();
             SA.DB.DenarnaEnota.DenarnaEnotaDB db = new SAOP.SA.DB.DenarnaEnota.DenarnaEnotaDB();
             DataSet ds = db.GetLookupForDenarnaEnota(SAOP.FW.DB.RecordStatus.All);

             // Turn into HTML friendly format  
             GetGridData summaryList = new GetGridData();

             summaryList.page = "1";
             summaryList.total = "10";
             summaryList.records = "160";
             int i = 0;
             foreach (DataRow dr in ds.Tables[0].Rows)  
             {
                 GridRows row = new GridRows();
                 row.id = dr["DenarnaEnotaID"].ToString();
                 row.cell = "[" + "\"" + dr["DenarnaEnotaID"].ToString() + "\""
                                       + "," + "\"" + dr["Kratica"].ToString() + "\""
                                       + "," + "\"" + dr["Naziv"].ToString() + "\""
                                       + "," + "\"" + dr["Sifra"].ToString() + "\""

                          + "]";
                 summaryList.rows.Add(row);
             }  
             return JsonConvert.SerializeObject(summaryList);

         }

我的 ASCX 代码是这样的:

jQuery(document).ready(function() {
  jQuery("#list").jqGrid({
    datatype: function(postdata) {
      jQuery.ajax({
        url: '../../AjaxWS/TemeljnicaEdit.asmx/GetGridData',
        data: '{}',
        dataType: 'json',
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        complete: function(jsondata, stat) {
          if (stat == "success") {
            var clearJson = jsondata.responseText;

            var thegrid = jQuery("#list")[0];
            var myjsongrid = eval('(' + clearJson + ')');
            alfs
            thegrid.addJSONData(myjsongrid.replace(/\\/g, ''));
          }
        }
      });
    },
    colNames: ['DenarnaEnotaID', 'Kratica', 'Sifra', 'Naziv'],
    colModel: [{
        name: 'DenarnaEnotaID',
        index: 'DenarnaEnotaID',
        width: 100
      },
      {
        name: 'Kratica',
        index: 'Kratica',
        width: 100
      },
      {
        name: 'Sifra',
        index: 'Sifra',
        width: 100
      },
      {
        name: 'Naziv',
        index: 'Naziv',
        width: 100
      }
    ],

    rowNum: 15,
    rowList: [15, 30, 100],
    pager: jQuery('#pager'),
    sortname: 'id',
    //  loadtext:"Nalagam zapise...",
    // viewrecords: true, 
    sortorder: "desc",
    // caption:"Vrstice", 
    // width:"800",
    imgpath: "../Scripts/JGrid/themes/basic/images"
  });

});

从 WS 我得到这样的 JSON:

{”page”:”1″,”total”:”10″,”records”:”160″,”rows”:[{"id":"18","cell":"["18","BAM","Konvertibilna marka","977"]“},{”id”:”19″,”cell”:”["19","RSD","Srbski dinar","941"]“},{”id”:”20″,”cell”:”["20","AFN","Afgani","971"]“},{”id”:”21″,”cell”:”["21","ALL","Lek","008"]“},{”id”:”22″,”cell”:”["22","DZD","Alžirski dinar","012"]“},{”id”:”23″,”cell”:”["23","AOA","Kvanza","973"]“},{”id”:”24″,”cell”:”["24","XCD","Vzhodnokaribski dolar","951"]“},{”id”:”25″,”cell”:”

………………

["13","PLN","Poljski zlot","985"]“},{”id”:”14″,”cell”:”["14","SEK","Švedska krona","752"]“},{”id”:”15″,”cell”:”["15","SKK","Slovaška krona","703"]“},{”id”:”16″,”cell”:”["16","USD","Ameriški dolar","840"]“},{”id”:”17″,”cell”:”["17","XXX","Nobena valuta","000"]“},{”id”:”1″,”cell”:”["1","SIT","Slovenski tolar","705"]“}]}

我已经注册了这个 JavaScript:

clientSideScripts.RegisterClientScriptFile("prototype.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/prototype-1.6.0.2.js"));

clientSideScripts.RegisterClientScriptFile("jquery.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/JGrid/jquery.js"));
clientSideScripts.RegisterClientScriptFile("jquery.jqGrid.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/JGrid/jquery.jqGrid.js"));
clientSideScripts.RegisterClientScriptFile("jqModal.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/JGrid/js/jqModal.js"));
clientSideScripts.RegisterClientScriptFile("jqDnR.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/JGrid/js/jqDnR.js"));

基本上我认为这一定是愚蠢的……但我现在想不通……

【问题讨论】:

    标签: asp.net jquery web-services json jqgrid


    【解决方案1】:

    在过去的几个小时里,我一直在尝试解决同样的问题。我现在已经放弃了让 AddJSONData 工作 - 我的 Web 服务方法返回一个数组,所以看起来使用 addRowData 可以工作。

    function ReceivedClientData(data) {
            var thegrid = $("#list4");
            for (var i = 0; i < data.length; i++) {
                thegrid.addRowData(i+1, data[i]);
            }
        }
    

    【讨论】:

    • 谢谢,这是解决方案 :) 请有人把汤姆的答案作为答案 :) 干杯
    • 如果不分页,可以将行嵌入到对象标签中... { 'page':1, 'total':1, 'records':rows.length, 'records ':rows } 并将其与 addJSONData 一起使用。
    • 这是一个根据您从 webservice 获得的内容进行少量修改的解决方案...对我来说是:success: function(jsondata, stat) { var thegrid = $("#list"); var 评估 = JSON.parse(jsondata.d); for (var i = 0; i
    【解决方案2】:

    jqGrid 的设置看起来不错。

    您确定您在jsondata.responseText 中返回的内容就是您所描述的吗?

    我在 .NET 中编写的 Web 服务返回 JSON 格式如下:

    {"d": "{”page”:”1″,”total”:”10″,”records”:”160″,”rows”:[{"id":"18","cell":"["18","BAM","Konvertibilna marka","977"]“}"
    

    在我的功能中,我必须这样做:

    complete: function(data) {
        var stuff = JSON.parse(data.responseText);
        jQuery("#grid")[0].addJSONData(JSON.parse(stuff.d));
    }
    

    在我真正得到我需要的数据之前,我必须将字符串转换为 JSON 两次。

    如果你有很大的问题。我建议逐个调试这个。执行如下简单语句:

    jQuery("#list")[0].addJSONData(JSON.parse("{total: 1, page: 1, records: 1, rows : [ {id: '1', cell:['1', '2007-10-01', 'test', 'note', 'new', '200.00', '10.00', '210.00']} ] }"));
    

    至少应该可以。之后,只需分析您从 Web 服务获得的输出,并确保您可以让该语句执行“完成”。

    【讨论】:

    • 我得到了像发布的那样的 json,因为我使用非 .net JSON 序列化程序。
    • 对,只是仔细检查。您是否尝试在 document.ready 或 onclick 功能期间自行执行该功能?只是看看它是否自己添加它?
    【解决方案3】:

    实际上,关键似乎是 addJSONData 上没有出现在文档中的参数:

    function ReceivedClientData(data) {
            var thegrid = $("#rowed2");
            thegrid[0].addJSONData(data,thegrid.bDiv,9)            
        }
    

    与之配套的网络方法是:

        [WebMethod(EnableSession = true)]
        public object GetTestClients(int pagenum, int rows)
        {
            var lst = Session["lst"] as List<Entities.Client>;
            if (lst == null)
            {
                lst = new List<Entities.Client>();
                for (int i = 1; i <= 5; i++)
                {
                    lst.Add(new TF.WebApps.Entities.Client()
                    {
                        ClientID = "Client" + i,
                        Firstname = "first" + i,
                        Lastname = "last" + i
                    });
                }
                Session["lst"] = lst;
            }
            var v = from c in lst
                    select new
                    {
                        id = c.ClientID,
                        cell = new object[] 
                        {
                            c.ClientID,
                            c.Firstname,
                            c.Lastname
                        }
                    };
    
            var result = new
            {
                total = v.Count() / rows,
                page = pagenum,
                records = rows,
                rows = v.Skip((pagenum-1)*rows).Take(rows).ToArray()
            };
    
    
            return result;
        }
    

    【讨论】:

      【解决方案4】:

      我还使用 web 服务将数据传递给 jqGrid。我遇到了同样的问题,这里是 .ajax 函数的完整部分的代码。

      complete: function(jsondata, stat) {
                   if (stat == "success") {
                      var thegrid = jQuery("#list2")[0];
                      var jsonObject = eval('(' + jsondata.responseText + ')');
                      thegrid.addJSONData(jsonObject.d);
                   }
                 }
      

      key是responseText被评估为JSON对象后的.d

      【讨论】:

        【解决方案5】:

        我知道它很旧,但这可能是你的问题......

        把row.cell做成List,然后就可以了……

        row.cell = new List {
            dr["DenarnaEnotaID"]
            ,dr["Kratica"]
            ,dr["Naziv"]
            ,dr["Sifra"]
        };

        在脚本方面...

        var myjsongrid = eval('('+clearJson+')');
        ...
        thegrid.addJSONData(myjsongrid.replace(/\\/g,''));
        

        myjsongrid 此时是一个对象,对象上通常没有 .replace 方法。此外,您可能应该使用嵌入 eval 的 JSON 解析器。我自己使用 Crockford 的 json2.js 的修改版本,但 YMMV。

        这应该使每一行都符合您的要求,让序列化程序处理转换...我实际上将我的数据表序列化为 { columns:['colname',...], rows:[['row1val',. ..],['row2val',...],...] } 并在客户端使用它,因为我使用一些相同的调用来填充各种网格...我有一个客户端 selectForJqGrid(table, keycol, [col list]) 将其设置为直接用于 jqGrid。

        【讨论】:

          【解决方案6】:

          这对我有用:

          mygrid[0].addJSONData(result, mygrid.bDiv, 0);
          

          或者试试这个:

          mygrid[0].addJSONData($.toJSON(result), mygrid.bDiv, 0);
          

          我的网格数据类型是 jsonstring。

          【讨论】:

            【解决方案7】:

            我对 jqGrid 的一些建议的误导程度感到非常惊讶。

            有两种方法可以为 jqGrid 提供来自服务的 JSON 数据。

            您可以编写一种方法来为 jqGrid 返回一个“块”数据,其中的数据刚好够一页结果。

            或者,您可以让自己的生活变得轻松,一次返回所有 JSON 数据,并让 jqGrid 处理分页,而无需进一步调用您的 JSON 服务。

            关键是 loadonce jqGrid 设置:

            loadonce: true,
            

            例如,我有一个 JSON Web 服务,它返回特定客户 ID 的订单列表:

            http://www.iNorthwind.com/Service1.svc/getOrdersForCustomer/BERGS

            ..我想用它创建这个 jqGrid:

            这是我的 jqGrid 声明的样子:

            $("#tblOrders").jqGrid({
                url: 'http://www.iNorthwind.com/Service1.svc/getOrdersForCustomer/BERGS',
                contentType: "application/json",
                datatype: "json",
                jsonReader: {
                    root: "GetOrdersForCustomerResult",
                    id: "OrderID",
                    repeatitems: false
                },
                mtype: "GET",
                colNames: ["ID", "Date", "ShipName", "ShipAddress", "ShipCity", "ShippedDate"],
                colModel: [
                    { name: "OrderID", width: 80, align: "center" },
                    { name: "OrderDate", width: 90, align: "center" },
                    { name: "ShipName", width: 250 },
                    { name: "ShipAddress", width: 250 },
                    { name: "ShipCity", width: 95 },
                    { name: "ShippedDate", width: 95 },
                ],
                pager: "#pager",
                height: 'auto',
                rowNum: 8,
                rowList: [8, 16, 24],
                loadonce: true,
                sortname: "OrderID",
                sortorder: "desc",
                viewrecords: true,
                gridview: true,
                autoencode: true,
                caption: "Northwind orders"
            });
            

            注意上面这三行:

                jsonReader: {
                    root: "GetOrdersForCustomerResult",
                    id: "OrderID",
                    repeatitems: false
                },
            

            这可以防止出现讨厌的“addJSONdata”异常,并告诉 jqGrid 实际上,我们的 JSON 数据数组存储在我的 JSON 结果的 GetOrdersForCustomerResult 部分中。

            {
              GetOrdersForCustomerResult: [
              {
                OrderDate: "8/12/1996",
                OrderID: 10278,
                ShipAddress: "Berguvsvägen 8",
                ShipCity: "Luleå",
                ShipName: "Berglunds snabbköp",
                ShipPostcode: "S-958 22",
                ShippedDate: "8/16/1996"
              },
              {
                OrderDate: "8/14/1996",
                OrderID: 10280,
                ...etc...
            

            就是这样。根本不需要调用 AddJSONdata。

            此示例的完整演练可以在我的博客上找到:

            http://mikesknowledgebase.com/pages/Services/WebServices-Page10.htm

            (我希望我能在三个小时前阅读这篇文章,当时我开始研究这些问题!!)

            【讨论】:

              【解决方案8】:

              您的问题是您应该将addJSONData 与responseText 一起使用。 eval 它,然后将 JSON 字符串解析为 JavaScript 中的 JSON。这应该可以解决。

              对于 Frenchie 的回答,我仍然会添加一些提示:

              complete: function(jsondata, stat) {
                       if (stat == "success") {              
                          var jsonObject = (eval("(" + jsondata.responseText + ")"));
                           $('#list2')[0].addJSONData(JSON.parse(jsonObject.d));
                       }
                     }
              

              这就是你的 JSON。并且 JqGrid 应该使用JsonReader 正确配置,以便在您加载数据时不会出错:请提供您拥有的任何索引。这应该可以解决您的问题。

              jsonReader: {
                          root: "rows", //arry containing actual data
                          page: "page", //current page
                          total: "total", //total pages for the query
                          records: "records", //total number of records
                          repeatitems: false,
                          id: "DenarnaEnotaID" //index of the column with the PK in it
                      },
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-07-27
                • 2019-04-29
                相关资源
                最近更新 更多