2009-05-12 4 views
3

Je suis en train d'accéder d'un simple itinéraire ASP.NET MVC, mais il est erroring avec:Besoin d'aide avec la route MVC quand je jQuery AJAX appeler un itinéraire

Le dictionnaire des paramètres contient une entrée nulle pour le paramètre 'isFoo' de type non annulable 'System.Boolean' pour la méthode 'System.Web.Mvc.ActionResult transform (booléen, System.String)' dans .. blablabla.

Ie. la propriété booléenne n'est pas définie ... ce qui signifie que la valeur n'est pas transmise.

J'ai donc une méthode Action appelée Transform (..) et n'accepte pas les valeurs HTTP-Postées sur avec jQuery. C'est comme si mes valeurs affichées étaient perdues :(

Le site MVC est une application Web standard MVC File-> New-> MVC Stock.Cependant, rien n'a été changé, à l'exception de l'ajout d'une nouvelle classe de contrôleur. il.

using System.Web.Mvc; 
using System.Web.Mvc.Ajax; 

namespace WorldDomination.EbonHawk.Web.Controllers 
{ 
    public class AjaxController : Controller 
    { 
     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Transform(bool isFoo, string bar) 
     { 
      // blah.... 
      return View(); 
     } 

    } 
} 

et comment on l'appelle, en utilisant jQuery ....

$.ajax({ 
    type: "POST", 
    url: "/ajax/transform", 
    data: "isfoo=true&bar=" + $("#Bar").val(), 
    contentType: "application/json;", 
    dataType: "json", 
    success: function() { alert("it worked"); }, 
    failure: function() { alert("Uh oh"); } 
}); 

Quand j'utilise Firebug, il montre que certainement je suis en train de POST à ​​l'URL. quelqu'un peut-il aider ?

Répondre

3

À première vue, il semble que vous confondiez jQuery ...

Vous dites que votre type de données est JSON, mais en soumettant du texte. Supprimez votre clause dataType de votre message AJAX et jQuery déterminera et soumettra votre message de manière appropriée.

+0

Je pensais que le contentType: "application/json;" et dataType: "json" était ce que j'espérais être renvoyé par le serveur? –

+0

En fait, je pense que vous avez raison. Cependant, vous devez toujours envoyer vos données au format JSON. –

+2

L'erreur était que je ne devrais pas avoir le contentType: "application/json;" valeur. Cela implique le format des données POST envoyées à travers le fil. le DataType: "json" est requis si je veux que les résultats soient json. –

1

Ce que Jeff a dit. Sinon, si vous souhaitez garder le dataType, votre ligne data devrait ressembler à ceci:

... 
data: { isfoo: true, bar: $("#Bar").val() }, 
... 
+1

si je fais cela, à quoi ressemble la méthode d'action du contrôleur? –

+0

transformation (isool booléen, barre de chaînes) – Elisabeth

0

actions contrôleur ASP.NET MVC traduisent simplement les paramètres POST ou GET dans des arguments à votre fonction. Si les arguments sont passés correctement en utilisant l'une de ces méthodes HTTP, ça devrait aller. Cependant, il semble que jQuery ne fonctionne pas correctement.

Vous devriez changer votre appel .ajax $ comme suit

$.ajax({ 
    type: "POST", 
    url: "<%= Url.Action("Transform", "Ajax") %>", 
    data: { isfoo: true, bar: $("#Bar").val() }, 
    contentType: "application/json;", 
    dataType: "json", 
    success: function() { alert("it worked"); }, 
    failure: function() { alert("Uh oh"); } 
}); 

Notez que ce problème n'a rien à voir avec le système de routage. Si vous souhaitez utiliser le routage pour créer une URL propre à appeler à l'aide de paramètres, vous devez modifier votre méthode en POST. Dans l'ensemble, la façon dont vous l'avez en ce moment est beaucoup plus propre, cependant. Cependant, il serait bon d'utiliser le système de routage pour générer l'URL de base de votre service.

EDIT:

Si vous deviez utiliser les paramètres GET comme si vous étiez dans l'option de données, vous devez aussi faire isFoo = lu isFoo =, je pense. Je ne me souviens pas si les majuscules sont importantes lors du paramétrage.

+0

Convenu que je devrais changer mon code à "<% = Url.Action (" Transform ", Ajax")%>. MAIS j'ai besoin d'en faire un POST car la valeur #Bar peut être _really vraiment_ longue. Parce que vous avez créé contentType: "app/json", est-ce la raison pour laquelle vous avez dû formater les données en: {clé: valeur, clé: valeur}? –

Questions connexes