【问题标题】:JQGrid - Empty Grid Not displaying DataJQGrid - 空网格不显示数据
【发布时间】:2014-09-01 20:57:41
【问题描述】:

我一直在尝试在 JQGrid 上启动和运行。事实证明这很困难。我在这方面花了很多时间,所以我会非常感谢任何可以提供帮助的人。

实际网格代码如下:

$(function () {
    $("#list2").jqGrid({
        url: '/Home/GetData',
        datatype: "json",        
        colNames: ['Inv No', 'Date', 'Client', 'Amount', 'Tax', 'Total', 'Notes'],
        colModel: [
            { name: 'id', index: 'id', width: 55 },
            { name: 'date', index: 'date', width: 90 },
            { name: 'client', index: 'client asc, date', width: 100 },
            { name: 'amount', index: 'amount', width: 80, align: "right" },
            { name: 'tax', index: 'tax', width: 80, align: "right" },
            { name: 'total', index: 'total', width: 80, align: "right" },
            { name: 'notes', index: 'notes', width: 150, sortable: false }
        ],
        jsonReader: {
            root: function(obj) {
                return $.parseJSON(obj);
            },
            page: "page",
            total: "total",
            records: "records",
            repeatitems: true,
            cell: "cell",
            id: "id",
            userdata: "userdata"
        },
        rowNum: 10,
        rowList: [10, 20, 30],
        pager: '#pager2',
        sortname: 'id',
        viewrecords: true,
        sortorder: "desc",
        caption: "JSON Example"
    });
    $("#list2").jqGrid('navGrid', '#pager2', { edit: false, add: false, del: false });

});

从服务器返回的 json 如下所示:

{
    "Page": "1",
    "Records": "13",
    "Total": 2,
    "UserData": {
        "Amount": 3220,
        "Name": "Totals:",
        "Tax": 342,
        "Total": 3564
    },
    "Rows": [{
        "Cell": {
            "Id": 13,
            "Date": "2014-09-01",
            "Client": "Client 3",
            "Amount": 1000.0,
            "Tax": 0.00,
            "Total": 1000.0,
            "Notes": null
        },
        "Id": 13,
    },
    {
        "Cell": {
            "Id": 14,
            "Date": "2014-09-01",
            "Client": "Client 4",
            "Amount": 2000.0,
            "Tax": 10.00,
            "Total": 2010.0,
            "Notes": null
        },
        "Id": 14,
    },
    {
        "Cell": {
            "Id": 15,
            "Date": "2014-09-01",
            "Client": "Client 5",
            "Amount": 3000.0,
            "Tax": 100.00,
            "Total": 3100.0,
            "Notes": null
        },
        "Id": 15,
    }]
}

任何人都可以看到问题吗?很高兴提供所有代码。使用 ASP.NET MVC 作为服务器技术。

编辑/更新

我更改了服务器的东西,以便 json 对象中的所有属性都是小写的。 我还为 rows 数组中的每个项目添加了一个 id 属性。还是不行:(

另外,我的 json 对象中出现了反斜杠,这与 jqGrid 站点上的示例不同:

"{\"page\":\"1\",\"records\":\"13\",\"total\":2,\"userData\":{\"amount\":6110,\"name\":\"Totals:\",\"tax\":110,\"total\":6220},\"rows\":[{\"cell\":{\"id\":13,\"date\":\"2014-09-01\",\"client\":\"Client 3\",\"amount\":1000.0,\"tax\":0.00,\"total\":1000.0,\"notes\":null},\"id\":13},{\"cell\":{\"id\":14,\"date\":\"2014-09-01\",\"client\":\"Client 4\",\"amount\":2000.0,\"tax\":10.00,\"total\":2010.0,\"notes\":null},\"id\":14},{\"cell\":{\"id\":15,\"date\":\"2014-09-01\",\"client\":\"Client 5\",\"amount\":3000.0,\"tax\":100.00,\"total\":3100.0,\"notes\":null},\"id\":15}]}"

编辑/更新

我终于摆脱了斜线。有效的组合是使用 JSON.NET 将数据序列化为 JSON,然后将其包装在 ContentResult 中。 JsonResult 正在序列化一个已经序列化为 JSON 的对象。

这是服务器端代码(C#):

public ActionResult GetData([FromUri]GridViewModel gridViewModel)
{
    var mockData = new MockData();

    mockData.Page = "1";
    mockData.Records = "13";
    mockData.Total = 2;
    mockData.UserData = new UserData
    {
        Amount = 6110,
        Name = "Totals:",
        Tax = 110,
        Total = 6220
    };

    mockData.Rows = new List<Object>
    {
        new
        {
            Cell = new Cell
            {
                Id = 13,
                Amount = 1000,
                Client = "Client 3",
                Date = DateTime.Now,
                Notes = null,
                Tax = 0.00M,
                Total = 1000
            },
            id = 13
        },
        new
        {
            Cell = new Cell
            {
                Id = 14,
                Amount = 2000,
                Client = "Client 4",
                Date = DateTime.Now,
                Notes = null,
                Tax = 10.00M,
                Total = 2010
            },
            id = 14
        },
        new
        {
            Cell = new Cell
            {
                Id = 15,
                Amount = 3000,
                Client = "Client 5",
                Date = DateTime.Now,
                Notes = null,
                Tax = 100.00M,
                Total = 3100
            },
            id = 15
        },
    };

    var jsonObject = JsonConvert.SerializeObject(
        mockData,
        Formatting.None,
        new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            DateFormatString = "yyyy-MM-dd",
            StringEscapeHandling = StringEscapeHandling.EscapeNonAscii
        }
        );

    //return Json(mockData, "application/json", JsonRequestBehavior.AllowGet);
    return new ContentResult
    {Content = jsonObject, ContentType = "application/json"};
}

public class MockData
{
    public string Page { get; set; }
    public string Records { get; set; }
    public int Total { get; set; }
    public UserData UserData { get; set; }

    public IEnumerable<Object> Rows { get; set; }

}

public class UserData
{
    public int Amount { get; set; }
    public string Name { get; set; }
    public int Tax { get; set; }
    public int Total { get; set; }
}

public class Cell
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public string Client { get; set; }
    public decimal Amount { get; set; }
    public decimal Tax { get; set; }
    public decimal Total { get; set; }
    public string Notes { get; set; }
}

【问题讨论】:

  • 你试过使用本地数据吗?它显示了什么???

标签: jquery jqgrid


【解决方案1】:

首先,如果您使用两个不同 JSON 数据发布一个问题,这很困难。您从服务器生成哪一个?我建议您使用 Fiddler 或 Internet Explorer 的开发者工具(按 F12 启动,然后使用网络选项卡开始捕获)来捕获服务器和客户端之间的 HTTP 流量。如果服务器响应真的像引用字符串一样

"{\"page\":\"1\",\"records\":\"13\",\"total\":2,...}

那么您可能将对象不需要序列化为 JSON。通常 ASP.NET 会为您进行 JSON 序列化。问题是只能对对象进行 JSON 序列化,但也可以对字符串进行序列化。在这种情况下,字符串中的引号 (") 将被转义(参见 here)。在这种情况下你真的仍然可以使用

jsonReader: {
    root: function (obj) {
        return $.parseJSON(obj).rows;
    },
    page: function (obj) {
        return $.parseJSON(obj).page;
    },
    total: function (obj) {
        return $.parseJSON(obj).total;
    },
    records: function (obj) {
        return $.parseJSON(obj).records;
    },
    repeatitems: false,
    userdata: "userData"
}

要读取您的数据,但我建议您最好调整服务器响应并删除其他不需要的 JSON 序列化。

尽管如此,jqGrid 甚至允许您读取您发布的数据。 The demo 证明了这一点。唯一需要解决的问题是在每一列中添加jsonmap 属性。

数据项通常看起来像

{"cell": ["13", "2014-09-01", "Client 3", "1000", "0", "1000", ""], "id": 13}

或喜欢

{
    "id": 13,
    "date": "2014-09-01",
    "client": "Client 3",
    "amount": 1000,
    "tax": 0,
    "total": 1000,
    "notes": null
}

不喜欢你的数据:

{
    "cell": {
        "id": 13,
        "date": "2014-09-01",
        "client": "Client 3",
        "amount": 1000,
        "tax": 0,
        "total": 1000,
        "notes": null
    },
    "id": 13
}

因此,为了能够读取您的数据,必须在 colModel 的每一列定义中添加 jsonmap 属性:

{ name: "id", jsonmap: "cell.id", width: 55 },
{ name: "date", jsonmap: "cell.date", width: 90 },
{ name: "client", jsonmap: "cell.client", width: 100 },
{ name: "amount", jsonmap: "cell.amount", width: 80, align: "right" },
{ name: "tax", jsonmap: "cell.tax", width: 80, align: "right" },
{ name: "total", jsonmap: "cell.total", width: 80, align: "right" },
{ name: "notes", jsonmap: "cell.notes", width: 150, sortable: false }

此外,我建议您将选项height: "auto"gridview: trueautoencode: true 添加到网格定义中。您没有发布您的服务器代码。您使用的 jqGrid 和 JSON 数据格式需要服务器端对数据进行排序、分页和搜索/过滤。如果您使用的数据集不是很大(例如少于 1000 行),您应该考虑从服务器一次返回 all 数据并使用loadonce: true 选项。如果第一次加载数据后datatype将更改为"local",数据将在jqGrid内部进行排序、分页和过滤。

【讨论】:

  • 感谢所有真正有用的信息。您对我的数据的观点很有趣,因为它是服务器在加载数据部分的 Json 数据演示 trirand.com/blog/jqgrid/jqgrid.html 中返回的内容。那是我得到我的数据的地方。使用提琴手。我想如果我复制演示,那就没问题了。干杯。
  • @onefootswill:不客气!我很高兴能帮助你。 the official jqGrid demo site 的演示包含一些为 非常旧的版本 jqGrid 创建的示例。例如,示例“加载数据”\“数组数据”首先包含i&lt;=mydata.length 而不是i&lt;mydata.length,然后使用addRowData 是填充网格的最差方式。而不是那个应该使用 gridview: true, data: mydata。您没有引用您使用的确切演示,但我相信您可以在这里找到其他不好的示例。
  • 嗨 Oleg,我一直在阅读文档,我只想知道这是否已过时 - trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data。具体来说,关于 json 数据的默认定义的一点 - 这与我的一致。当演示和文档过时时,很难学习这个网格:(
  • 继续学习这个网格,我在2013年的一个论坛帖子中找到了tutorial link。json数据的形状和我的完全一样。所以现在我只是不知道 json 应该是什么样子。
  • @onefootswill:The documentation 是最新的。 jqGrid 允许读取几乎任何输入的 JSON 数据,但问题是哪个 JSON 会更好。您首先需要了解 每一行网格 将具有 唯一 id 属性(rowid)。您应该在 JSON 数据中包含 id。其次,您应该决定是否需要向用户显示 id(具有 id 值的列)。下一个问题:是否需要使用repeatitems: false 或默认的repeatitems: true 格式的数据。并且应该使用loadonce: true
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多