Paramètre null du contrôleur MVC3 à l’aide de json.ssortingngify

J’ai une méthode de contrôleur très simple qui accepte un paramètre Guid, comme si

public JsonResult GetById(Guid id) { var results = from a in repository.AsQueryable() where a.Id == id orderby a.Name select new { id = a.Id, name = a.Name }; return Json(results, JsonRequestBehavior.AllowGet); } 

Le paramètre est toujours nul lorsque vous utilisez JSON.ssortingngify () dans Chrome, IE et Firefox. Exemple…

 $(document).ready(function () { var o = new Object(); o.id = 'C21803C3-1385-462E-ACEA-AFA1E554C635'; $.getJSON('@Url.Action("GetById", "User")', JSON.ssortingngify(o), function () { alert('Completed'); }); }); 

Cela a déjà fonctionné dans ASP.NET 4.0. Ce qui est étrange, c’est que ce qui suit fonctionne.

 $(document).ready(function () { $.getJSON('@Url.Action("GetById", "User")', { "id": "C21803C3-1385-462E-ACEA-AFA1E554C635" }, function () { alert('Completed'); }) .error(function (a, b, c) { alert(a.responseText); alert(b); alert(c); }); }); 

Si je cours …

 $(document).ready(function () { var o = new Object(); o.id = 'C21803C3-1385-462E-ACEA-AFA1E554C635'; alert(JSON.ssortingngify(o)); }); 

Je reçois

 {"id":"C21803C3-1385-462E-ACEA-AFA1E554C635"} 

affiché, JSON approprié. Et si je cours

 $(document).ready(function () { var o = new Object(); o.id = 'C21803C3-1385-462E-ACEA-AFA1E554C635'; var json_text = JSON.ssortingngify(o, null, 2); alert(json_text); var your_object = JSON.parse(json_text); alert(your_object.id); }); 

Si obtenir

 C21803C3-1385-462E-ACEA-AFA1E554C635 

Notes complémentaires,

J’ai essayé cela comme un post ajax, même problème. J’ai essayé un poste limité, mais voir ci-dessous pour un travail complet cependant.

J’ai essayé d’insérer un espace, comme JSON.ssortingngify (o, null, 2), même problème.

Utilisation de jquery-1.7.1.min.js, jquery-ui-1.8.16.custom.min.js, jquery.unobtrusive-ajax.js, jquery.validate.min.js et jquery.validate.unobtrusive.min. js. Le seul autre JS consiste à ouvrir des formulaires dans une boîte de dialog jQuery si le javascript est activé et à créer un tableau cliquable.

 $.ajaxSetup({ cache: false }); $(document).ready(function () { $(".openDialog").live("click", function (e) { e.preventDefault(); $("
") .addClass("dialog") .attr("id", $(this).attr("data-dialog-id")) .appendTo("body") .dialog({ title: $(this).attr("data-dialog-title"), close: function () { $(this).remove() }, modal: true }) .load(this.href); }); $(".close").live("click", function (e) { e.preventDefault(); $(this).closest(".dialog").dialog("close"); }); var clickableTable = $('tr[data-tr-clickable-url]'); if (clickableTable.length > 0) { clickableTable.addClass('clickable') // Add the clickable class for mouse over .click(function () { window.location.href = $(this).attr('data-tr-clickable-url'); }); // Remove the last child, containing anchors to actions, from each row, including the header. $('tr :last-child').remove(); } });

METTRE À JOUR

Les oeuvres suivantes:

 var o = new Object(); o.Id = 'C21803C3-1385-462E-ACEA-AFA1E554C635'; $.ajax({ url: '@Url.Action("GetById", "User")', type: "POST", data: JSON.ssortingngify(o), dataType: "json", contentType: "application/json; charset=utf-8", success: function () { alert('completed'); } }); 

Ce qui suit ne fonctionne pas:

 var o = new Object(); o.Id = 'C21803C3-1385-462E-ACEA-AFA1E554C635'; $.ajax({ url: '@Url.Action("GetById", "User")', data: JSON.ssortingngify(o), dataType: "json", contentType: "application/json; charset=utf-8", success: function () { alert('completed'); } }); 

Ainsi, la suppression de POST en tant que type entraîne l’échec de l’appel. Notez que selon la documentation de jQuery, $ .getJSON est équivalent à

 $.ajax({ url: url, dataType: 'json', data: data, success: callback }); 

Remarquez, il n’y a pas de type défini. Vous ne savez pas exactement où se trouve l’erreur, mais quelque chose manque quelque part. D’autant que le passage d’un object JSON réel sur $ .getJSON fonctionne réellement.

Je pense que le problème vient du classeur de modèle par défaut qui n’accepte pas les méthodes GET transmettant JSON via QuerySsortingng.

Par exemple:

  $.getJSON('/', JSON.ssortingngify({id:"test"})); 

Générera cette requête GET GET http: // localhost ? {% 22id% 22:% 22test% 22} HTTP / 1.1

Ici, il semble que le modelbinder ait du mal à le relier. Sans ssortingngify

  $.getJSON('/', {id:"test"}); 

va générer cette requête GET GET http: // localhost /? id = test HTTP / 1.1

Et il est possible que MVC le lie, cela revient à l’envoyer dans QuerySsortingng. Utiliser POST insted fonctionnera bien.

Mais vous pouvez aussi implémenter un classeur personnalisé, peut-être quelque chose comme ceci (je ne sais pas exactement comment faire cela)

 public class Binder : IModelBinder { #region IModelBinder Members public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var query = controllerContext.HttpContext.Request.Url.Query; var json = System.Web.HttpUtility.UrlDecode(query.Remove(0,1)); JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Deserialize(json, bindingContext.ModelType.GetType()); } #endregion } 

Ce que je pense être faux, c’est que vous essayez de définir un object o alors que l’id que vous essayez de transmettre est à l’intérieur de l’object o, pas dans l’object lui-même.

Alors essayez ce code

 $.getJSON('@Url.Action("GetById", "User")', JSON.ssortingngify(o.id), function () { alert('Completed'); });