2010-10-01 3 views
0

Je cherche à créer un tableau JSON de positions de souris et à les transmettre à un contrôleur. Pour une raison que j'ignore, mon json revient du contrôleur comme non défini, est-ce que quelqu'un peut repérer mon problème?Impossible de recevoir les données JSON vers le contrôleur .NET MVC

// Attempt at declaring a JSON object 
var personResults = { "answers": [] }; 

// Onclick I fire in values from mouse event 
personResults.answers[count] = { "xpos": mouseX, "ypos": mouseY }; 

// AJAX Call 
$.ajax({ 
    url: "Save", 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(personResults), 
    success: function (data) { alert(data.toSource()); }, 
    error: function (req, status, error) { 
     alert("error! " + status + error + req); 
    } 
}); 

Je reçois alors le jsontext de mon contrôleur .NET MVC:

public JsonResult Save(string personResults) 
{ 
    return Json(personResults); 
} 

Comme vous pouvez le voir la réponse à l'AJAX devrait être la même chose que je JSON envoyé - mais je Je reçois des valeurs indéfinies du serveur même si mon json semble construire Ok et je l'ai testé - c'est valide.

Si je définis Enregistrer pour recevoir de type "chaîne" je reçois cette alerte "(new String (" "))"; Si je mets l'action de sauvegarde pour recevoir de type « JsonResult » Je reçois cette alerte:

({ContentEncoding:null, ContentType:null, Data:null, JsonRequestBehavior:1}) 

Suis-je manque quelque chose tout à fait évident? Je veux juste vérifier que mon json est envoyé avec succès au contrôleur afin que je puisse le manipuler plus tard!

est ici le format de mon JSON:

{"answers":[ 
    {"xpos":293,"ypos":415},{"xpos":293,"ypos":415},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416}, 
    {"xpos":293,"ypos":416},{"xpos":293,"ypos":416},{"xpos":293,"ypos":416} 
]} 

Merci!

Répondre

1

Comment je comprends votre question, vous voulez savoir comment envoyer des données (paramètres d'entrée) à l'action de votre contrôleur MVC qui retournera JsonResult retour.

Votre première erreur est que les données d'entrée de l'action Save doivent être non au format JSON. MVC a conçu davantage pour travailler avec des formulaires, donc si vous envoyez des données à l'action Save, les données doivent être codées en url. Par exemple, pour avoir « Bla Bla » en entrée de personResults paramètre de l'action Save votre appel jQuery devrait suivre

$.ajax({ 
    url: "Home/Save", 
    type: "POST", 
    data: "personResults=Bla+Bla", 
    success: function (data) { 
     alert(data); }, 
    error: function (req, status, error) { 
     alert("error! " + status + error); 
    } 
}); 

Plus de mieux faire aucun codage manuel de la chaîne « Bla Bla » et utiliser data: {personResults: "Bla Bla"} au lieu de data: "personResults=Bla+Bla" .

Si vous souhaitez envoyer des données plus complexes au contrôleur MVC, vous pouvez le faire, mais vous devez convertir les données en JSON et les sauvegarder manuellement.Par exemple, si vous ajoutez une nouvelle action Save1: (. De la même façon, vous pouvez utiliser DataContractJsonSerializer au lieu de JavaScriptSerializer)

public JsonResult Save1 (string encodedAnswers) { 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    MyData data = serializer.Deserialize<MyData> (encodedAnswers); 
    return Json (data); 
} 

MyData défini comme

public class MyData 
{ 
    public List<MyPosition> answers { get; set; } 
} 
public class MyPosition 
{ 
    public int xpos { get; set; } 
    public int ypos { get; set; } 
} 

Le code JavaScript correspondant pourrait être la suite

var personResults = {"answers":[{"xpos":293, "ypos":415 },{"xpos":293, "ypos":416}]}; 
// or var personResults = {answers: [{xpos: 293, ypos: 415},{xpos: 293, ypos: 416}]}; 

$.ajax({ 
    url: "Home/Save1", 
    type: "POST", 
    data: {encodedAnswers: JSON.stringify(personResults)}, 
    success: function (data) { 
     alert("answers[0].xpos="+data.answers[0].xpos); }, 
    error: function (req, status, error) { 
     alert("error! " + status + error); 
    } 
}); 
+0

Merci pour votre réponse approfondie c'est plus que je n'aurais pu espérer! J'essayais essentiellement de voir si mon Json était valide car j'ai besoin de le mapper à une base de données comme vous l'avez montré ci-dessus. Alors maintenant, je désérialise la chaîne à un objet de classe et la boucle à travers cet objet pour effectuer des opérations sur les valeurs! acclamations =] – Sykth

+0

Merci à toutes les réponses et votre temps a été apprécié! – Sykth

+0

@Sykth: Bienvenue! – Oleg

1

Je ne comprends vraiment pas l'utilité de votre action de contrôleur, mais si vous voulez simplement pour retourner la même chaîne JSON qu'elle a reçu en entrée, vous pouvez utiliser la méthode Content:

public ActionResult Save(string personResults) 
{ 
    return Content(personResults, "application/json"); 
} 
0

Votre $. Ajax appel transforme les données en une chaîne, et le vous retournez juste une chaîne. Il peut ne pas être capable de comprendre comment traiter cela, et cela peut ne pas être nécessaire.

Cependant, vous suggérons d'essayer dans votre contrôleur:

return Json(new { personResults = personResults }); 
Questions connexes