【问题标题】:jqGrid not data display in the gridjqGrid没有数据显示在网格中
【发布时间】:2011-08-11 10:52:16
【问题描述】:

在 ASP.NET MVC 3.0 应用程序中,我使用 jqGrid。我使用下面的代码。我看到网格但没有数据。我传入了“GridData”操作,列表内容是一个元素,但网格中没有任何内容。

C#:

public ActionResult GridData()
{

    List<Customer> list = new List<Customer>();
    list.Add(new Customer() { Code = "AAA", FirstName = "BBB", LastName = "CCC" });

    return Json(list);
}

HTML:

<table id="jqgProducts" cellpadding="0" cellspacing="0"></table>
<div id="jqgpProducts" style="text-align:center;"></div>

<script type="text/javascript">
    $(document).ready(function () {
        $('#jqgProducts').jqGrid({
            //url from wich data should be requested
            url: '/Customer/GridData/',
            //type of data
            datatype: 'json',
            //url access method type
            mtype: 'GET',
            //columns names
            colNames: ['Id', 'LastName','FirstName', 'Code'],
            //columns model
            colModel: [
                  { name: 'Id', index: 'Id', align: 'left' },
                  { name: 'LastName', index: 'LastName', align: 'left' },
                  { name: 'FirstName', index: 'FirstName', align: 'left' },
                  { name: 'Code', index: 'Code', align: 'left' }
                ],
            //pager for grid
            pager: $('#jqgpProducts'),
            //number of rows per page
            rowNum: 10,
            //initial sorting column
            sortname: 'Id',
            //initial sorting direction
            sortorder: 'asc',
            //we want to display total records count
            viewrecords: true
        });
    }); 
</script>

【问题讨论】:

    标签: javascript jquery asp.net-mvc jqgrid


    【解决方案1】:

    首先,您应该使用 JsonRequestBehavior.AllowGet 作为 jqGrid 的第二个参数从 MVC 操作返回 JSON 数据。

    接下来,主要问题是数据格式。有等待 jqGrid 的默认数据格式。格式在the documentation 中描述。因此,您可以生成标准格式的 JSON 数据,例如 Saad 建议的格式,或者将 jsonReader 参数添加到 jqGrid,这将描述如何读取当前 JSON 数据。所以用几乎一样的GridData

    public ActionResult GridData() {
        var list = new List<Customer> {
            new Customer {Id = "myid1", Code = "AAA", FirstName = "BBB", LastName = "CCC"}
        };
    
        return Json (list, JsonRequestBehavior.AllowGet);
    }
    

    可以添加以下jsonReader参数

    jsonReader: {
        id: "Id",
        repeatitems: false,
        root: function (obj) { return obj; },
        page: function () { return 1; },
        total: function () { return 1; },
        records: function (obj) { return obj.length; }
    }
    

    读取数据。您可以在上面的代码中看到我将Id 属性添加到Customer 类。该属性可以是一个整数字符串。对于 jqGrid,两者都可以。 Id 值将被保存两次:一次作为网格行的&lt;tr&gt; 元素的id,一次作为第一个表格列的&lt;td&gt; 元素。如果您从不需要为用户显示 id,您可以从网格中删除 Id 列,但仍将 id 放在 JSON 数据中。如果您将使用非唯一 ID,您可能会遇到与 here 所述相同的问题。

    另一种方法是更改​​ MVC 操作的代码,使其以默认格式生成 JSON 数据。为此,您可以将GridData 的代码更改为以下内容:

    public ActionResult GridData() {
        var list = new List<Customer> {
            new Customer {Id = "myid1", Code = "AAA", FirstName = "BBB", LastName = "CCC"}
        };
        return Json (new {
            page = 1,
            total = 1,
            records = list.Count,
            rows = (from x in list
                    orderby x.Id
                    select new {
                        id = x.Id,
                        cell = new[] {
                            x.Code,
                            x.FirstName,
                            x.LastName
                        }
                    }
            )
        }, JsonRequestBehavior.AllowGet);
    }
    

    我包含上面的所有代码只是为了理解 jqGrid 基础知识。在上面的代码中,数据将按Id 排序,这对应于您在jqGrid 中使用的sortname: 'Id'。该名称将作为sidx 参数发送到服务器。此外,jqGrid 的参数sortorder: 'asc'rowNum: 10 将定义动作的sordrows 参数的值。发送到服务器的最后一个参数page 最初将设置为1,如果用户选择下一页,则会增加。所以典型的MVC动作原型是

    public ActionResult GridData (string sidx, string sord, int page, int rows)
    

    我建议您阅读the old answer 和下一个answer 的更新部分。我希望这些答案能让您在 jqGrid 的使用方面取得进步。 Here你会在这个问题上找到答案:为什么jqGrid等待的JSON数据的默认格式看起来很奇怪。

    【讨论】:

      【解决方案2】:

      我们还在 project 中使用 jqGrid。检查这两个链接:controller(LoadApplicationGrid) 和view。还有here我们的 JQGridView 自定义 Json 结果。

      另外,您可以使用JsonRequestBehavior.AllowGet 允许对Json 结果的GET 方法,然后直接从浏览器调用该操作并将序列化数据与jqGrid 要求进行比较。

      【讨论】:

      • 好吧,我按照你的代码在这里做了同样的事情....网格仍然是空的。我想我要回到 datadable 或其他解决方案
      • 好的。 jqGrid 初始化可能有错误。检查此链接xenta.codeplex.com/SourceControl/changeset/view/11201#117958。文件中有很多代码,看一下以“@if(Html.IsScriptRegistered("jqGrid"))”开头的js代码。此外,您似乎将响应作为序列化列表发送,没有页面索引、页数和总计数(您将 List 传递给 Json 方法,我们传递 anon 对象)。看看我们的 jsonReader 设置。
      • var jsonData = new { pageIndex = pageIndex + 1, pageCount = pageCount, totalCount = totalCount, data = data.ToArray() }; return Json(jsonData); - 这样我们创建了一个匿名对象用于序列化。
      【解决方案3】:

      我认为您的控制器在GridData() 中引发了异常,因为默认情况下 MVC3 不允许 JSON 响应 GET 请求。 您可以像这样修改此行为:

      public ActionResult GridData()
      {  
          List<Customer> list = new List<Customer>();
          list.Add(new Customer() { Code = "AAA", FirstName = "BBB", LastName = "CCC" });
      
          return Json(list, JsonRequestBehavior.AllowGet);
      }
      

      【讨论】:

      • 你可能应该使用调试器,并获得有关你的问题的更多信息
      • 你认为我不使用调试器? :) 在返回的调试器点列表中有 1 个元素。我不能告诉你更多。
      • 答案是:[{"FirstName":"BBB","LastName":"CCC","Id":39,"Code":"AAA"} ]
      • 所以问题出在您的客户端代码中,而不是在您的服务器代码中。这已经是很多额外的信息了
      【解决方案4】:

      试试这个代码段。我总是创建一个 JqgridRow 以在 Json 中返回。

      public ActionResult GridData()
      

      {

      List<Customer> list = new List<Customer>();
      list.Add(new Customer() { Code = "AAA", FirstName = "BBB", LastName = "CCC" });
      
      var GetData = new
                      {
                          rows = (from x in list 
                                  select new JqGridRow()
                                  {
                                      cell = new string[] {
                                          x.Code.ToString(),
                                          x.FirstName.ToString(),
                                          x.LastName .ToString(),
                                      }
                                  }
                                  ).ToArray()
                      };
      
      return Json(GetData , JsonRequestBehavior.AllowGet);
      

      }

      希望对你有所帮助..

      【讨论】:

      • 从 dll 'Lib.Web.Mvc' 你可以从tpeczek.codeplex.com/releases/view/63274得到它
      • 命名空间?我搜索了这个方法但没有,并且作者在chm文件中没有谈到这个方法(帮助)。除了使用额外的库之外别无他法?
      • 我用这种方式来填充网格,好像比较容易。
      • 我无法测试它,因为“JqGridRow”即使引用的 DLL 也是未知的
      • 我有一个项目,其中包含这个库的完整代码。告诉我你的身份证,如果你愿意,我会发邮件给你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      相关资源
      最近更新 更多