jqGrid ne remplit pas de données

J’essaie de renseigner un jqGrid avec les données d’un service Web. J’ai examiné le code et la documentation jqGrid à fond. J’ai besoin d’un autre regard pour regarder le code ci-dessous et me dire si quelque chose me manque.

Comme vous le verrez dans le code, la grid est configurée pour se charger lors du chargement de la page ou lors d’une actualisation. Une fois la grid chargée, je passe un appel Ajax pour récupérer (encore une fois) les données JSON et les afficher dans un div situé sous la grid.

Je vois la plupart du comportement attendu. Une fois la page chargée, la grid affiche l’indicateur de chargement, puis l’appel Ajax est lancé et les données JSON s’affichent sous la grid. Le problème est que la grid est complètement vide. Les en-têtes de colonne sont corrects, mais aucune donnée n’apparaît dans le corps de la grid.

Voici le code:

$(document).ready(function () { $('#resultDiv').html(''); $('#waitIndicator').hide(); $("#list").jqGrid({ datatype: 'json', url: 'WeatherDataService.svc/GetWeatherData', jsonReader: { root: "Rows", page: "Page", total: "Total", records: "Records", repeatitems: false, userdata: "UserData", id: "StationId" }, loadui: "block", mtype: 'GET', rowNum: 10, rowList: [10, 20, 30], viewrecords: true, colNames: ['Station ID', 'Station Name', 'Timestamp', 'Max Temp', 'Min Temp', 'Precipitation', 'Snowfall', 'SnowDepth'], colModel: [ { name: 'StationId', index: 'StationId' }, { name: 'StationName', index: 'StationName' }, { name: 'Timestamp', index: 'Timestamp', align: 'right' }, { name: 'MaxTemperature', index:'MaxTemperature',align:'right'}, { name: 'MinTemperature', index:'MinTemperature',align:'right'}, { name: 'Precipitation', index: 'Precipitation', align:'right'}, { name: 'Snowfall', index: 'Snowfall', align: 'right' }, { name: 'SnowDepth', index: 'SnowDepth', align: 'right' }, ], pager: '#pager', sortname: 'StationId', sortorder: 'asc', caption: 'Weather Records', loadComplete: function () { // if the page index is not set (eg page index = 0), // force the page index to first page var pageIndex = $('#list').jqGrid('getGridParam', 'page'); if (pageIndex == 0) pageIndex = 1; $('#waitIndicator').show(); $.ajax({ url: 'WeatherDataService.svc/GetWeatherData', type: "GET", data: ({ page: pageIndex, rows: 10, sidx: 'StationId', sord: 'asc' }), dataType: "json", success: function (response) { $('#resultDiv').html(response); $('#waitIndicator').hide(); }, error: function (xmlHttpRequest, textStatus, errorThrown) { $('#resultDiv').html('textStatus: ' + textStatus + ', errorThrown: ' + errorThrown); } }); } }); }); 

Voici les données JSON du service Web:

 { "Total": 14975, "Page": 1, "Records": 149746, "Rows": [ { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(725871600000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null }, { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(725958000000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null }, { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(726044400000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null }, { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(726130800000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null }, { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(726217200000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null }, { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(726303600000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null }, { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(726390000000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null }, { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(726476400000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null }, { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(726562800000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null }, { "StationId": 50130, "StationName": "ALAMOSA WSO AP", "Timestamp": "\/Date(726649200000)\/", "MaxTemperature": null, "MinTemperature": null, "Precipitation": null, "Snowfall": null, "SnowDepth": null } ], "UserData": null } 

Pour la plupart des colonnes, les valeurs nulles seront des cellules vides. Mais je m’attends à voir au moins les StationIDs et StationNames. Merci d’avoir jeté un coup d’oeil.

Tout d’abord, si le serveur renvoie les données que vous avez publiées, jqGrid affichera les résultats (voir http://www.ok-soft-gmbh.com/jqGrid/jsonfromsvc.htm ). Bien sûr, jqGrid ne fonctionnera pas vraiment bien, car vous utilisez StationId comme identifiant, mais toutes les lignes de vos données JSON ont la même valeur que 50130. Ainsi, par exemple, si vous sélectionnez une ligne, toutes les lignes seront sélectionnées.

DateTime n’est pas un type JSON standard et n’est pas actuellement pris en charge par jqGrid (voir cette réponse et cette demande de fonctionnalité ). Pour résoudre le problème, vous devez apporter au moins de petites modifications à la fois dans les données et dans jqGrid.

Les données JSON actuelles contiennent beaucoup de données avec une valeur nulle. Pour réduire la taille des données vides envoyées par le serveur, envisagez d’utiliser l’atsortingbut EmitDefaultValue .

De plus, je trouve étrange de ne pas utiliser de parameters tels que

 ajaxGridOptions: { contentType: "application/json" }, serializeRowData: function (data) {return JSON.ssortingngify(data);} 

(voir une autre réponse ancienne ). Votre WFC ne reçoit probablement aucun paramètre d’entrée tel que int page, int rows, ssortingng sidx, ssortingng sord , etc.). Si vous postez au moins un prototype de votre méthode de serveur que vous appelez.

MISE À JOUR: Comme je l’avais promis avant de créer une petite application WCF et une page HTML appelant le service WCF.

Vos données actuelles n’ont pas d’identifiant . Le champ StationId long n’est pas une clé car il est identique dans différentes lignes de données. Si vous incluez id dans vos données, vous pouvez inclure dans la définition de colonne la key:true option key:true et jqGrid utilisera les données comme identifiant. Comme l’exemple ne sera utilisé que pour afficher les données sans édition de données, je n’ai inclus aucun identifiant dans l’envoi de données à partir du serveur. Dans le cas jqGrid, utilisez un compteur entier commençant par 1 comme identifiant de ligne. Si vous décidez d’inclure des fonctionnalités d’édition dans la grid, vous devrez inclure un identifiant dans les données.

Maintenant, passons au code. Parce que vous avez écrit que vous utilisez Visual Studio 2010 et que vous ne répondez pas à la version de .NET, j’ai créé une application dans .NET 4.0. Le web.config :

                       

Fichier WeatherDataService.svc :

 <%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="WfcToJqGrid.WeatherDataService" %> 

Fichier IWeatherDataService.cs :

 using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; namespace WfcToJqGrid { [ServiceContract] public interface IWeatherDataService { [OperationContract, WebGet (RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetWeatherData?page={page}&rows={rows}" + "&sidx={sortIndex}&sord={sortDirection}")] WeatherDataForJqGrid GetDataForjqGrid (int page, int rows, ssortingng sortIndex, SortDirection sortDirection); } [DataContract] public enum SortDirection { [EnumMember (Value = "asc")] Asc, [EnumMember (Value = "desc")] Desc } // jsonReader: { repeatitems: false } [DataContract] public class WeatherDataForJqGrid { [DataMember (Order=0, Name = "total")] public int Total { get; set; } // total number of pages [DataMember (Order = 1, Name = "page")] public int Page { get; set; } // current zero based page number [DataMember (Order = 2, Name = "records")] public int Records { get; set; } // total number of records [DataMember (Order = 3, Name = "rows")] public IEnumerable Rows { get; set; } } [DataContract] public class WeatherData { [DataMember (Order=0)] public int StationId { get; set; } [DataMember (Order = 1)] public ssortingng StationName { get; set; } [DataMember (Order = 2)] public DateTime Timestamp { get; set; } [DataMember (Order = 3, EmitDefaultValue = false)] public ssortingng MaxTemperature { get; set; } [DataMember (Order = 4, EmitDefaultValue = false)] public ssortingng MinTemperature { get; set; } [DataMember (Order = 5, EmitDefaultValue = false)] public ssortingng Precipitation { get; set; } [DataMember (Order = 6, EmitDefaultValue = false)] public ssortingng Snowfall { get; set; } [DataMember (Order = 7, EmitDefaultValue = false)] public ssortingng SnowDepth { get; set; } } } 

Fichier WeatherDataService.svc.sc :

 using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel.Web; using System.Net; namespace WfcToJqGrid { public class WeatherDataService : IWeatherDataService { // we use very simple database model to simulate a real data private static IQueryable _repository = new List{ new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,1,8,0,0)}, new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,2,8,0,0)}, new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,3,8,0,0)}, new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,4,8,0,0)}, new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,5,8,0,0)}, new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,6,8,0,0)}, new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,7,8,0,0)}, new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,8,8,0,0)}, new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,9,8,0,0)}, new WeatherData { StationId = 50130, StationName = "ALAMOSA WSO AP", Timestamp = new DateTime(1993,1,10,8,0,0)} }.AsQueryable (); public WeatherDataForJqGrid GetDataForjqGrid (int page, int rows, ssortingng sortIndex, SortDirection sortDirection){ int totalRecords = _repository.Count(); // sorting of data IQueryable orderdData = _repository; System.Reflection.PropertyInfo propertyInfo = typeof(WeatherData).GetProperty (sortIndex); if (propertyInfo != null) { orderdData = sortDirection == SortDirection.Desc ? (from x in _repository orderby propertyInfo.GetValue (x, null) descending select x) : (from x in _repository orderby propertyInfo.GetValue (x, null) select x); } // paging of the results IEnumerable pagedData = orderdData .Skip ((page > 0? page - 1: 0) * rows) .Take (rows); // force revalidate data on the server on every request if (WebOperationContext.Current != null) WebOperationContext.Current.OutgoingResponse.Headers.Set ( HttpResponseHeader.CacheControl, "max-age=0"); return new WeatherDataForJqGrid { Page = page, Records = totalRecords, Total = (totalRecords + rows - 1) / rows, Rows = pagedData }; } } } 

(en savoir plus sur la mise en cache des “données jqGrid stockées dans le cache du navigateur?” ) et sur default.htm :

    Demonstration how use jqGrid to call WFC service           

Vous pouvez télécharger le code complet ici .