【问题标题】:jqGrid not rendering data - Headers visiblejqGrid 不呈现数据 - 标题可见
【发布时间】:2015-05-08 19:16:17
【问题描述】:

在玩 jqGrid 时,我遇到了以下问题。 jqGrid 中的数据没有被渲染。即使我能够看到所有列的网格标题,但数据没有出现。我正在以 JSON 格式从控制器的操作方法返回数据。

<script type="text/javascript">
        $(document).ready(function () {
            //alert("this is a test");
            $(btnContactList).click(function () {
                $("#ContactTable").jqGrid({
                    url: "/Contact/ContactList",
                    datatype: "json",
                    colNames: ["First Name", "Last Name", "EMail"],
                    colModel: [
                        //{ name: "ContactId", index: "ContactId", width: 80 },
                        { name: "FirstName", index: "FirstName", width: 100 },
                        { name: "LastName", index: "LastName", width: 100 },
                        { name: "EMail", index: "EMail", width: 200 }
                    ],
                    //data: result,
                    mtype: 'GET',
                    //loadonce: true,
                    viewrecords: true,
                    gridview: true,
                    caption: "List Contact Details",
                    emptyrecords: "No records to display",
                    jsonReader: {
                        root: "rows",
                        page: "page",
                        id: 0

                    }
                });
                alert("complete - success");
           });

        });


 </script>

控制器中的动作方法:

public JsonResult ContactList()
    {
        List<Contact> contacts = new List<Contact>();

        contacts.Add ( new Contact()
            {
                FirstName = "John",
                LastName = "Doe",
                Email = "john.doe@gmail.com"
            }
        );



        return Json(contacts, JsonRequestBehavior.AllowGet);
    }

Network 选项卡输出显示调用 Action 方法“ContactList”返回的 JSON 数据,如下面的屏幕截图所示。

jqGrid 标头也正在呈现,但控制器的 Action 方法返回的数据(JSON 格式)没有呈现到 jqGrid 中。

我在哪里犯错了?

即使按照@Oleg 在下面的评论中的建议修改了代码,问题仍然存在。没有错误。弹出来自“loadComplete”事件的警报。

<script type="text/javascript">

        $(document).ready(function () {
            //alert("this is a test");
            $(btnContactList).click(function () {



                $("#ContactTable").jqGrid({
                    url: "/Contact/ContactList",
                    datatype: "json",
                    colNames: ["First Name", "Last Name", "EMail"],
                    colModel: [

                        { name: "FirstName", index: "FirstName", width: 100 },
                        { name: "LastName", index: "LastName", width: 100 },
                        { name: "EMail", index: "EMail", width: 200 }
                    ],
                    mtype: 'GET',
                    loadonce: true,
                    viewrecords: true,
                    gridview: true,
                    caption: "List Contact Details",
                    emptyrecords: "No records to display",
                    loadComplete: function () {
                        alert("Complete ok!")
                    },
                    loadError: function (jqXHR, textStatus, errorThrown) {
                        alert('HTTP status code: ' + jqXHR.status + '\n' +
                            'textstatus: ' + textstatus + '\n' +
                            'errorThrown: ' + errorThrown);
                        alert('HTTP message body  (jqXHR.responseText: ' +     '\n' + jqXHR.responseText);
                    }
                });
                alert("complete - success");

            });

        });

【问题讨论】:

  • 您使用哪个版本的 jqGrid? 我建议您添加loadonce: true 选项和loadError 回调(请参阅the answer)。您使用的jsonReader 包含错误信息。如果您使用不太旧的 jqGrid 版本,则可以将其删除或添加 jsonReader: { root: function (obj) { return obj; } }
  • 这是我在文件“jquery.jqGrid.min.js”顶部找到的 - jqGrid 4.4.3 - jQuery Grid
  • 遇到这样的问题后,我想知道这个网格控件有多可靠。尽管网格无法将其与数据绑定,但我可以看到 JSON 格式的响应。
  • 当我第一次单击按钮时,数据现在已成功加载到网格中。但是,如果我重新单击该按钮,则不会发生任何事情。我希望它会重新加载网格并重新加载数据,但它不会那样工作。想知道为什么它会这样吗?
  • 很清楚,因为$("#ContactTable").jqGrid({...}); 创建网格。这意味着它将最初的空表转换为相对复杂的潜水和表结构。您可以创建一次网格,然后调用$("#ContactTable").trigger("reloadGrid"); 以重新加载网格的主体,或者您也可以添加$("#ContactTable").jqGrid("GridUnload"); 在创建网格之前。如果存在,它将破坏 jqGrid。您的代码中的更多问题是没有使用寻呼机。我建议您至少添加顶级寻呼机toppager: true 或添加rowNum: 1000(默认为20)。

标签: jquery json asp.net-mvc jqgrid


【解决方案1】:

您使用非常旧的版本。它没有输入格式的自动检测。因此,您必须指定 jsonReader 与您的数据完全对应。至少需要jsonReader 的两个属性:

jsonReader: {
    repeatitems: false,
    root: function (obj) { return obj; } 
}

以上设置应该可以解决主要问题。另外应该理解 jqGrid 将id 属性分配给每一行(每个&lt;tr&gt; 元素)。如果您稍后要实现 jqGrid 的其他功能(例如编辑),您将需要通过 id 识别行。因此,强烈建议在输入数据中包含id 属性。如果您有 Contact 对象的本机 ID 和另一个名称(例如 "Id""ContactId"),您可以在 jsonReader 内指定额外的 id 属性(如 id: "Id"id: "ContactId")。您也应该在服务器响应中包含相应的属性。

我建议您考虑将 jqGrid 更新到最新的free jqGrid(或至少更新到free jqGrid 4.8)。您可以在the readmewiki 中阅读有关免费 jqGrid 功能的更多信息。 Free jqGrid是我自己开发的jqGrid的fork。

【讨论】:

  • 终于成功了!在我看到您的回复之前,我尝试了同样的事情并且它有效,但非常感谢您的帮助!你成功了。
  • 会考虑升级版本。再次感谢您的帮助!
【解决方案2】:

终于成功了。谢谢@Oleg!我在这里看到另一个帖子http://goo.gl/Pg5CMn

此外,我认为我又犯了一个错误。我忘了用双引号将 btnContactList 括起来。在 Internet Explorer 中调试后,我发现了这一点。其次,正如@Oleg 建议的那样, jsonReader 属性是必需的。可能是因为我使用的 jqGrid 版本。

<script type="text/javascript">
            $(document).ready(function () {
            //alert("this is a test");
            $("#btnContactList").click(function () {

                $("#ContactTable").jqGrid({
                    url: "/Contact/ContactList",
                    datatype: "json",
                    colNames: ["ID", "First Name", "Last Name", "EMail"],
                    colModel: [
                        { name: "ContactId", index: "ContactId", width: 80 },
                        { name: "FirstName", index: "FirstName", width: 100 },
                        { name: "LastName", index: "LastName", width: 100 },
                        { name: "EMail", index: "EMail", width: 200 }
                    ],
                    //data: result,
                    mtype: 'GET',
                    loadonce: true,
                    viewrecords: true,
                    gridview: true,
                    caption: "List Contact Details",
                    emptyrecords: "No records to display",
                    jsonReader: {
                        repeatitems: false,
                        //page: function () { return 1; },
                        root: function (obj) { return obj; },
                        //records: function (obj) { return obj.length; }
                    },
                    loadComplete: function () {
                        alert("Complete ok!")
                    },
                    loadError: function (jqXHR, textStatus, errorThrown) {
                        alert('HTTP status code: ' + jqXHR.status + '\n' +
                            'textstatus: ' + textstatus + '\n' +
                            'errorThrown: ' + errorThrown);
                        alert('HTTP message body  (jqXHR.responseText: ' +     '\n' + jqXHR.responseText);
                    }

                });
                alert("after completion");

            });


        });
</script>

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多