MVC, ajax, json poste de contrôleur de l'action méthode
Je suis en train de réaliser un JQuery AJAX appel à une méthode d'action du contrôleur qui contient un objet complexe comme un paramètre.
J'ai lu beaucoup de blogs et j'ai essayé plusieurs techniques tirées de ces. La poste-clé sur lequel j'ai construit ma meilleure tentative code (ci-dessous) est la stackoverflow post ici .
Je veux déclencher une asynchrone post, appelée lorsque l'utilisateur onglets en dehors d'un champ [pas une Forme d'économiser de l'après – comme l'a démontré dans d'autres exemples que j'ai trouvés].
Mon intention est de:
- Instancier un objet sur le client [pas le ViewModel qui fournit le type de la Vue];
- Remplir l'objet avec des données provenant de plusieurs champs dans la vue;
- Convertir cet objet JSON;
- Appeler la méthode d'action du contrôleur à l'aide de jQuery.Ajax méthode, en passant l'objet JSON.
Les résultats seront retournés comme un résultat JSON; et les données seront chargées dans les champs de la vue en fonction des résultats retournés.
Les problèmes sont:
- Si la méthode d'action est attribuée à la HttpPost attribut, le contrôleur de l'Action méthode n'est pas appelée (même si l'appel AJAX type est réglé sur "POST").
- Si la méthode d'action isattributed avec HttpGet, les valeurs des propriétés du paramètre sont null
- La méthode ReadObject envoyait le message d'erreur: "Attend élément" racine " de l'espace de noms ".. Rencontrés "None" avec "nom d'espace de noms'".
J'espère que quelqu'un peut vous aider. Merci. Le Code ci-dessous:
Client fichier js
var disputeKeyDataObj = {
"InvoiceNumber": "" + $.trim(this.value) + "",
"CustomerNumber": "" + $.trim($('#CustomerNumber').val()) + ""
};
var disputeKeyDataJSON = JSON.stringify(disputeHeadlineData);
$.ajax({
url: "/cnr/GetDataForInvoiceNumber",
type: "POST",
data: disputeKeyDataJSON,
dataType: 'json',
contentType: "application/json; charset=utf-8",
success: EnrichedDisputeKeyData(result)
});
Action de Filtre et de classe pour le type associé à la méthode d'Action de paramètre
[DataContract]
public class DisputeKeyData
{
[DataMember(Name = "InvoiceNumber")]
public string InvoiceNumber { get; set; }
[DataMember(Name = "CustomerNumber")]
public string CustomerNumber { get; set; }
}
Méthode d'Action sur le contrôleur
//[HttpPost]
[ObjectFilter(Param = "disputeKeyData", RootType = typeof(DisputeKeyData))]
public ActionResult GetDataForInvoiceNumber(DisputeKeyData disputeKeyData)
{
//Blah!
//....
return Json(disputeKeyData, JsonRequestBehavior.AllowGet);
}
Vous devez vous connecter pour publier un commentaire.
Ci-dessous comment j'ai obtenu ce travail.
Le point Clé était:
J'avais besoin d'utiliser le ViewModel associée à la vue de l'exécution pour être en mesure de résoudre l'objet de la demande.
[Je sais qu'il y a une manière de lier un objet autre que celui par défaut ViewModel objet, mais a terminé tout simplement de peupler les propriétés nécessaires pour mes besoins que je ne pourrais pas obtenir de travail]
Le script JQuery utilisé pour appeler cette méthode d'action:
{"Invoice Number":
son{InvoiceNumber:
, qui je suppose est une partie de votre problème.Ce post de blog répond directement à votre problème.
Il utilise une technique sans avoir besoin d'autres JSON bibliothèques clientes. Elle introduit un vraiment simple plugin jQuery qui va vous aider à faire le tour.
Quelle est la version de asp.net mvc utilisez-vous? Affichage objets json fortement typées contrôleur des actions ont été ajoutés dans ASP.NET MVC 3 Beta 1. Cette article explique une solution de contournement à l'aide de modèles de classeurs pour asp.net mvc 2 et info sur la façon dont il fonctionne dans MVC 3.