2010-12-08 3 views
1

Je voudrais passer des paramètres à mon webservice de jquerys ajax. Comment puis je faire ça?Comment passer des paramètres à la méthode webservice [OperationContract] à partir de jquery/ajax?

J'ai déjà examiné quelques-unes des questions connexes, mais je n'ai pas trouvé de solution qui a fonctionné pour moi. J'ai essayé ceci: jQuery AJAX parameter not being passed to MVC mais je n'utilise pas mvc donc je suis sûr que c'est pourquoi la solution ne fonctionne pas. Mon jquery ressemble à ceci:

  $.ajax({ 
       type: "POST", 
       contentType: "application/json; charset=utf-8", 
       url: "CarService.svc/GetCar", 
       data: {CarID:117}, 
       dataType: "json", 
       success: function (data) { 
        $("#lblCurrentTime").text(""); 
        $("#lblCurrentTime").text(data.d.CarID); 
       } 
      }); 

Quelque chose ne va pas avec moi « données », non? Si laisser les données: partie en tant que données: « {} » Je peux obtenir ma méthode pour exécuter (et je ne passe aucun paramètre) mais dès que j'essayer ce qui précède à Firebug me dit:

Firebug's log limit has been reached. 0 entries not shown. Preferences 
POST http://localhost:64461/TimeService.svc/GetCar 
POST http://localhost:64461/TimeService.svc/GetCar 

500 Internal Server Error 
    1.12s 

Mon Webservice ressemble à ceci:

[OperationContract] 
    public CarTable GetCar(int id) 
    { 
     using (var sqlc = new SqlConnection(@"sdfgsdfg")) 
     { 
      sqlc.Open(); 
      var cmd = sqlc.CreateCommand(); 
      cmd.CommandText = "HUGE QUERY HERE ^^"; 
      //id = 117; 
      cmd.Parameters.Add("CarID", System.Data.SqlDbType.Int).Value = id; 
      using (var reader = cmd.ExecuteReader()) 
      { 
       CarTable Cars = new CarTable(); 

       while (reader.Read()) 
       { 
        Cars.CarID = reader["CarID"].ToString(); 
        Cars.CarName = reader["CarName"].ToString(); 
       } 


       return Cars; 

      } 
     } 
    } 
[DataContract] 
public class CarTable 
{ 
    [DataMember] 
    public string CarID { get; set; } 
    [DataMember] 
    public string CarName { get; set; } 
} 

EDIT: Si je change la partie de données:

data: CarID=117, 

Je reçois Sys.ParameterCountException: décalage de comptage des paramètres. [Pause sur cette erreur] {name: "format", type: String}

+0

Êtes-vous en mesure d'appeler votre webservice en utilisant un outil comme SoapUI? –

+0

Avez-vous essayé "complet" au lieu de succès, et vu ce que les messages d'erreur étaient? – Matrym

+0

Je ne connais pas cet outil, mais je vais le vérifier maintenant. – Robodude

Répondre

2

D'abord, vous devez vérifier que vous incluez attribuer

[WebInvoke (ResponseFormat = WebMessageFormat.Json)] 

la méthode GetCar ou faire la même chose dans web.config. Ensuite, vous devez utiliser data:"117" ou data:JSON.stringify(117) au lieu de data: {feat:117}.

MISE À JOUR: Si vous a une entrée de données plus complexes, par exemple comme un objet CarTable le paramètre data doit être data:JSON.stringify({CarID: 117, CarName: "BMW"}), il devrait donc être construit de la même manière. Le JSON.stringify est défini dans http://www.json.org/js.html.

Encore une remarque. Après le retour réussi des données, vous verrez que les données retournées doivent être accessibles non pas avec data.d.CarID, mais avec data.CarID à la place. Le service Web ASMX place les données dans la propriété d, mais pas dans le service WCF.

MISE À JOUR 2: Je ne sais pas quelle petite erreur vous faites, j'ai donc créé un petit service WCF qui fait ce dont vous avez besoin. Vous pouvez télécharger le code source ici http://www.ok-soft-gmbh.com/jQuery/WcfData.zip. Pour être sûr de pouvoir le compiler, j'ai utilisé Visual Studio 2008. Dans Visual Studio 2010, le fichier web.config peut être beaucoup plus simple.

+0

Hey Oleg merci! J'ai remplacé [OperationContract] par [WebInvoke (ResponseFormat = WebMessageFormat.Json)]. Mais je reçois toujours la même erreur 500 lorsque j'essaie de transmettre des données avec toutes les différentes options. – Robodude

+0

typiquement on utilise à la fois les attributs [OperationContract] 'et [WebInvoke (ResponseFormat = WebMessageFormat.Json)]', mais vous n'avez posté qu'une partie de la définition ... J'espère que le reste est corrigé. – Oleg

+0

Ok. J'ai gardé operationContract aussi, mais aucune des solutions ne semble fonctionner correctement. Je reçois systématiquement l'erreur 500 ou Sys.ParameterCountException: Incompatibilité de compte de paramètre. [Rompez sur cette erreur] {name: "format", tapez: Chaîne} – Robodude

0

Je pense que le nom du paramètre doit correspondre à l'appel du service.

essayer de changer

data: {CarID:117},

juste data: {ID:117},

+0

Merci. J'ai essayé ceci mais cela n'a pas fonctionné :( – Robodude

2
data: {CarID:117}, 

devrait être:

data: "{'id':'117'}", 

Le paramètre de données doit être une chaîne. Les paires nom et valeur doivent être cotées pour être JSON valide. Le nom de la paire nom/valeur doit correspondre au paramètre d'entrée du service Web.

+0

Merci pour votre réponse, mais cela n'a pas résolu mon problème :( – Robodude

1

essayer de changer

data: {CarID:117}, 

juste data: {id:117},

Questions connexes