jqGrid没有在MVC中显示json数据

Posted

技术标签:

【中文标题】jqGrid没有在MVC中显示json数据【英文标题】:jqGrid not showing json data in MVC 【发布时间】:2017-12-20 17:06:01 【问题描述】:

jqGrid 没有显示从 MVC 控制器获取的 json 数据,它还有一个 emptyrecords 标签,在这种情况下也是不可见的。这是我的 jQuery 代码-

$(function () 
            $("#JQGrid1").jqGrid(
                url: "/CertificateDetails/GetCertificateDetails",
                datatype: 'json',
                mtype: 'Get',
                colNames: ['Name', 'Issuer', 'Location', 'Private Key[Yes/No]'],
                //data: dataArray,
                colModel: [
                   
                       key: false,
                       name: 'Name',
                       index: 'Name',
                       editable: false
                   ,
                   
                       key: false,
                       name: 'Issuer',
                       index: 'Issuer',
                       editable: false
                   ,
                   
                       key: false,
                       name: 'Location',
                       index: 'Location',
                       editable: false
                   ,
                   
                       key: false,
                       name: 'HasPrivateKey',
                       index: 'HasPrivateKey',
                       editable: false
                   
                ],
                height: '100%',
                viewrecords: true,
                caption: "Certificate Details",
                emptyrecords: "No record to display!!"
            );
        );

控制器代码:

CertDetails cd = new CertDetails();
        public ActionResult Index()
        
            return View();
        
        //
        // GET: /CertificateDetails/
        public ActionResult GetCertificateDetails()
        
            var stores = new Dictionary<StoreName, string>()
                
                        StoreName.My, "Personal",
                        StoreName.Root, "Trusted roots",
                        StoreName.TrustedPublisher, "Trusted publishers",
                        StoreName.AddressBook, "Address Book",
                        StoreName.AuthRoot, "Auth Root",
                        StoreName.CertificateAuthority, "Certificate authority",
                        StoreName.Disallowed, "Disallowed",
                        StoreName.TrustedPeople, "Trusted people"
                // and so on
                .Select(s => new  store = new X509Store(s.Key, StoreLocation.LocalMachine), location = s.Value ).ToArray();

            foreach (var store in stores)
                store.store.Open(OpenFlags.ReadOnly); // open each store

            var list = stores.SelectMany(s => s.store.Certificates.Cast<X509Certificate2>()
                .Select(mCert => new CertDetails
                
                    HasPrivateKey = mCert.HasPrivateKey ? "Yes" : "No",
                    Name = mCert.FriendlyName != "" ? mCert.FriendlyName : "Unavailable",
                    Location = s.location,
                    Issuer = mCert.Issuer
                )).ToList();

            return Json(list,JsonRequestBehavior.AllowGet);
        

这是控制器动作方法返回的数据-

["Name":"Unavailable","HasPrivateKey":"Yes","Location":"Personal","Issuer":"CN=Dell Issuing Certificate Authority 302, OU=MS PKI, O=Dell Inc.","Name":"IIS Express Development Certificate","HasPrivateKey":"Yes","Location":"Personal","Issuer":"CN=localhost"]

我从控制器获取 JSON 格式的数据,但 jqGrid 既没有显示任何数据,也没有显示空记录标签。知道如何解决这个问题吗?

【问题讨论】:

您使用哪个版本的jqGrid以及来自哪个fork的jqGrid(free jqGrid,商业Guriddo jqGrid JS或版本中的旧jqGrid =4.7)?您能否将您的问题附加到从服务器返回的测试数据中?您可以使用 Chrome/IE/Firefox 的开发者工具来查看确切的 HTTP 响应。 @Oleg,我正在使用 jQuery.jqGrid,可在 nuget 上免费获得,版本为 4.4.4。我在 var list 中获取数据,但它没有显示在网格中。 我建议你卸载已经死了很久的复古版本4.4.4,并在当前版本:4.14.1安装free-jqGrid NuGet包。测试 JSON 数据呢?顺便说一句,我建议您从colModel 中删除不需要的key: false,editable: falseindex 属性并添加jqGrid 选项loadonce: true, forceClientSorting: true @Oleg,我已经在 action 方法返回的问题正文中添加了数据。 你试过免费的 jqGrid 4.14.1 吗?问题还存在吗? JSFiddle 允许使用 Echo 服务 (url: "/echo/json/") 来模拟服务器响应。必须将json 参数与数据一起发送到服务器,服务器应返回该数据。可以使用postData: json: ... 来执行此操作。 Echo 服务需要使用 HTTP POST。您可以在演示 jsfiddle.net/OlegKi/3j7dz8aa/2 上看到对代码进行的如此微小的更改,该演示有效。您可以使用更多功能。见jsfiddle.net/OlegKi/3j7dz8aa/3。无论如何,我认为您发布的 JSON 数据没有问题。 【参考方案1】:

您可以尝试使用 jQuery DataTable 插件,如下所示:

$(document).ready(function () 
        $("#myGrid").dataTable(
            "ajax": 
                "url": "/CertificateDetails/GetCertificateDetails",
                "dataSrc": ""
            ,
            "columns": [
                "data": "Name"
            , 
                "data": "Location"
            , 
                "data": "Issuer"
            , 
                "data": "HasPrivateKey"
            ]

        );
    );

<table id="myGrid">
    <thead>
        <tr style="text-align:left;">
            <th>Name</th>
            <th>Location</th>
            <th>Issuer</th>
            <th>HasPrivateKey?</th>
        </tr>
    </thead>
      </table>

不要忘记添加引用-

<link rel="stylesheet" type="text/css" href="http://cdn.datatables.net/1.10.9/css/jquery.dataTables.min.css">
<script type="text/javascript" charset="utf8" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.2.0.min.js"></script>
    <script type="text/javascript" charset="utf8" src="http://cdn.datatables.net/1.10.9/js/jquery.dataTables.min.js"></script>

【讨论】:

以上是关于jqGrid没有在MVC中显示json数据的主要内容,如果未能解决你的问题,请参考以下文章

带有spring mvc的jqgrid json数据类型

jqgrid json不加载数据

无法在 asp.net mvc 4 中将 JSON 对象映射到 JqGrid

日期格式 JSON jqgrid

无法使用新的json数据重新加载JQGrid

jqgrid加载json数据时,后台有返回数据,而且有多少行就加载了多少行的表格,可是每行的数据都显示为空。