Je cherchais des centaines de liens depuis 3 heures, par exemple en ajoutant scriptfactory à webconfig, 3 erreurs, en définissant le type de contenu, etc.
Je ne suis pas capable de comprendre quelle est l’erreur en réalité.
Environnement: Service s’exécutant sur une application Web .net 4.0 s’exécutant sur .net 4.0
Conditions requirejses: Je dois lier un jqGrid au service Web asmx qui me renvoie un json sous forme de chaîne. Le fichier de service Web contient le code suivant.
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [ScriptService] public class SampleService : System.Web.Services.WebService { [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public ssortingng GetJsonServerProcess() { int memory = 1; ssortingng json = ssortingng.Empty; var obj = (System.Diagnostics.Process.GetProcesses().Where(r => r.WorkingSet64 > memory).Select(p => new { p.ProcessName, p.WorkingSet64 }).ToArray()); json = Lib.ToJSON(obj); return json; } }
Javascript est comme suit
$(document).ready(function () { jQuery("#jqgajax").jqGrid({ ajaxGridOptions: { type: "POST", contentType: 'application/json; charset=utf-8' }, url:'http://localhost:1092/SampleService.asmx/GetJsonServerProcess', datatype: "json", data: "{}", colNames: ['ProcessName', 'WorkingSet64'], colModel: [ { name: 'ProcessName', index: 'ProcessName', width: 55 }, { name: 'WorkingSet64', index: 'WorkingSet64', width: 90 } ], rowNum: 10, width: 700, rowList: [10, 20, 30], sortname: 'invdate', viewrecords: true, sortorder: "desc", caption: "New API Example" }); });
HTML est comme suit
Sortie du service Web en cliquant sur le bouton Invoke
[{"ProcessName":"Dropbox","WorkingSet64":22736896}, {"ProcessName":"fdhost","WorkingSet64":1941504}, {"ProcessName":"IntelliTrace","WorkingSet64":39276544} ]
S’il vous plaît suggérer ce qui est là qui me manque. tags
m’énervent. Je suppose que ces balises ne permettent pas à ma grid de se lier.
METTRE À JOUR:
Le service ASMX se présente maintenant comme ci-dessous.
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [ScriptService] public class SampleService : System.Web.Services.WebService { [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public List GetJsonServerProcess() { List test = new List(); for(int i=1;i<=10;i++) test.Add(new demo { ProcessName = string.Format("Sample {0}",i), WorkingSet64 = i }); var re = test; return re; } } public class demo { public string ProcessName { get; set; } public int WorkingSet64 { get; set; } }
Un clic sur le bouton Invoke renvoie XML, car la requête ne spécifie pas le contentType: 'application/json; charset=utf-8'
contentType: 'application/json; charset=utf-8'
. Donc, l’expérience de cliquer sur le bouton Invoquer aide pas vraiment.
Le principal problème de votre code est que vous convertissez les données en chaîne dans la méthode Web. La ligne
json = Lib.ToJSON(obj);
ne sont pas nécessaires. Ce que l’on fait généralement est de retourner l’object. GetJsonServerProcess
doit être remplacé par quelque chose comme:
[ScriptService] public class SampleService : System.Web.Services.WebService { [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public List GetJsonServerProcess() { int memory = 1; return System.Diagnostics.Process.GetProcesses() .Where(r => r.WorkingSet64 > memory) .Select(p => new { p.ProcessName, p.WorkingSet64 }) .ToList(); } }
Le problème suivant est que le format d’entrée par défaut qui attend jqGrid en est un autre (voir ici ). Vous devez donc spécifier jsonReader
qui décrit le format de données. Dans votre cas, ce sera quelque chose comme
jsonReader: { repeatitems: false, id: "ProcessName", root: function (obj) { return obj; }, page: function () { return 1; }, total: function () { return 1; }, records: function (obj) { return obj.length; } }
De plus, vous ne devriez jamais utiliser http://localhost:1092/
prefix dans l’ url
Ajax, car vous ne récupérez que les données du même site pour des raisons de sécurité. Le paramètre data
dans jqGrid a une autre signification que dans jQuery, vous devez donc supprimer les data: "{}"
et déplacer le type: "POST"
de ajaxGridOptions
vers mtype: "POST"
. Comme résultat, vous aurez quelque chose comme
$(document).ready(function () { $("#jqgajax").jqGrid({ mtype: "POST", ajaxGridOptions: { contentType: 'application/json; charset=utf-8' }, url: '/SampleService.asmx/GetJsonServerProcess', postData: "{}", // remove all parameters which jqGrid send typically datatype: "json", colNames: ['ProcessName', 'WorkingSet64'], colModel: [ { name: 'ProcessName', index: 'ProcessName', width: 155 }, { name: 'WorkingSet64', index: 'WorkingSet64', width: 190 } ], jsonReader: { repeatitems: false, id: "ProcessName", root: function (obj) { return obj; }, page: function () { return 1; }, total: function () { return 1; }, records: function (obj) { return obj.length; } }, rowNum: 10, loadonce: true, gridview: true, height: 'auto', rowList: [10, 20, 30], viewrecords: true, sortorder: "desc", caption: "New API Example" }); });
Je n’ai pas testé le code, mais il devrait être plus proche de ce dont vous avez besoin.
MISE À JOUR : Vous devriez corriger le code en changeant jsonReader
. Vous pouvez télécharger la démo de travail ici . Il affiche la grid
J’ai utilisé le code côté serveur
using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Web.Services; namespace jqGridWebASMX { [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [System.Web.Script.Services.ScriptService] public class SampleService : WebService { [WebMethod] public List GetJsonServerProcess() { const int memory = 1; return Process.GetProcesses() .Where (r => r.WorkingSet64 > memory) .Select(p => new Demo { Id = p.Id, ProcessName = p.ProcessName, WorkingSet64 = p.WorkingSet64 }) .ToList(); } } public class Demo { public int Id { get; set; } public ssortingng ProcessName { get; set; } public long WorkingSet64 { get; set; } } }
et du côté client
$("#list").jqGrid({ mtype: "POST", ajaxGridOptions: { contentType: 'application/json; charset=utf-8' }, url: '/SampleService.asmx/GetJsonServerProcess', postData: "{}", // remove all parameters which jqGrid send typically datatype: "json", colNames: ['ProcessName', 'WorkingSet64'], colModel: [ { name: 'ProcessName', index: 'ProcessName', width: 200 }, { name: 'WorkingSet64', index: 'WorkingSet64', width: 120, formatter: 'integer', sorttype: 'int', align: 'right' } ], jsonReader: { repeatitems: false, id: "Id", root: function (obj) { return obj.d; }, page: function () { return 1; }, total: function () { return 1; }, records: function (obj) { return obj.d.length; } }, rowNum: 10, loadonce: true, gridview: true, height: 'auto', pager: '#pager', rowList: [10, 20, 30], rownumbers: true, viewrecords: true, sortorder: "desc", caption: "New API Example" }); $("#pager_left").hide(); // hide unused part of the pager to have more space
Ok, j’ai la même erreur et après une série d’essais et d’erreurs, voici ma solution “rapide et sale”;
$.get(url, {var1: parameter1, var2: parameter2}, function(data){ data = JSON.parse($(data).find("ssortingng").text()); alert("data.source: " + data.source); });
Ce code fonctionne parfaitement
SqlDataAdapter sda = new SqlDataAdapter(strsql, ConfigurationManager.ConnectionSsortingngs["BTConSsortingng"].ToSsortingng()); DataSet das = new DataSet(); sda.Fill(das); Context.Response.Output.Write(JsonConvert.SerializeObject(das, Newtonsoft.Json.Formatting.Indented)); Context.Response.End(); return ssortingng.Empty;
response = await client.GetAsync(RequestUrl, HttpCompletionOption.ResponseContentRead); if (response.IsSuccessStatusCode) { _data = await response.Content.ReadAsSsortingngAsync(); try { XmlDocument _doc = new XmlDocument(); _doc.LoadXml(_data); return Request.CreateResponse(HttpStatusCode.OK, JObject.Parse(_doc.InnerText)); } catch (Exception jex) { return Request.CreateResponse(HttpStatusCode.BadRequest, jex.Message); } } else return Task.FromResult(Request.CreateResponse(HttpStatusCode.NotFound)).Result;
Pour une réponse JSON valide, utilisez ce code.
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [ScriptService] public class SampleService : System.Web.Services.WebService { [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public void GetJsonServerProcess() { int memory = 1; ssortingng json = ssortingng.Empty; var obj = (System.Diagnostics.Process.GetProcesses().Where(r => r.WorkingSet64 > memory).Select(p => new { p.ProcessName, p.WorkingSet64 }).ToArray()); json = Lib.ToJSON(obj); this.Context.Response.ContentType = "application/json; charset=utf-8"; this.Context.Response.Write(json); } }
Le code suivant devrait faire l’affaire:
this.Context.Response.ContentType = "application/json; charset=utf-8"; this.Context.Response.Write(json);