Liaison JSON ASP.NET MVC 4 au modèle View - Erreur d'objet imbriqué
J'ai eu le problème avec json de liaison pour le modèle de vue. Voici mon code:
partie de mon Viewmodel (AddressViewModel a plus de propriétés):
public class AddressViewModel
{
[Display(Name = "Address_Town", ResourceType = typeof(Resources.PartyDetails))]
public string Town { get; set; }
[Display(Name = "Address_Country", ResourceType = typeof(Resources.PartyDetails))]
public Country Country { get; set; }
}
public class Country : EntityBase<string>
{
public string Name { get; set; }
protected override void Validate()
{
if (string.IsNullOrEmpty(Name))
{
base.AddBrokenRule(new BusinessRule("CountryName", "Required"));
}
}
}
Javascript:
$(document).on("click", "#addAddress", function () {
var jsonData = {
"Town": $('#txt-Town').val(),
"District": $('#txt-District').val(),
"Street": $('#txt-Street').val(),
"PostCode": $('#txt-PostCode').val(),
"FlatNumber": $('#txt-FlatNumber').val(),
"PremiseName": $('#txt-PremiseName').val(),
"PremiseNumber": $('#txt-Premisenumber').val(),
"Country": {
"Name": $('#txt-Country').val(),
}
};
var addressData = JSON.stringify(jsonData);
$.ajax({
url: '/Customer/SaveAddress',
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: addressData,
success: function (result) {
$("#addIndividualAddressDialog").data("kendoWindow").close();
},
error: function (result) {
alert("Failed");
}
});
});
En-tête de contrôleur:
[HttpPost]
public ActionResult SaveAddress(AddressViewModel addressViewModel)
C'est ce que je vois avec firebug:
Et c'est ce que je vois dans VS:
Comme vous pouvez le voir de la Plaine propriétés sont liées correct mais mon objet imbriqué (Pays) est nulle. J'ai lu beaucoup d'articles différents et je ne sais toujours pas ce que je fais mal. Aider moi s'il vous plaît!
source d'informationauteur Piotr Czarnecki
Vous devez vous connecter pour publier un commentaire.
Le problème est de votre méthode d'action de paramètre:
Que vous utilisez
JSON.stringify()
vous envoyez une chaîne à votre contrôleur, pas un objet! Donc, vous avez besoin de faire quelques travaux d'arriver à votre but:1) Changer votre méthode d'action parametter:
2) Désérialiser la chaîne d'un objet - c'est-à AddressViewModel:
Donc, votre dernière méthode d'action devrait être comme suit:
Vous pouvez conserver votre ActionMethod intacte, sans la nécessité de la sérialisation json:
Dans le côté client de créer un objet à partir de votre json:
et l'envoyer dans l' $.ajax données de propriété.
Ou, au lieu de créer json, créer un objet:
Et encore, envoyer cet objet dans l' $.ajax données de propriété.
En fait, la meilleure option est seulement pour enlever la
ligne et d'envoyer jsonData lui-même. ASP.NET MVC auto-lier, si c'est un objet réel, et pas seulement une chaîne de caractères.
Le Rasoir d'Occam
Désolé pour la réponse pour les vieux thread.ici vous pouvez travailler avec
JsonResult
au lieu deActionResult
c'est votre signature
il devrait ressembler à
l'avantage serait si vous utilisez
JsonResult
au lieu deActionResult
que u n'avez pas besoin deDeserialize
voici le lien http://codeforcoffee.org/asp-net-mvc-intro-to-mvc-using-binding-json-objects-to-models/ à partir de ce lien, vous pouvez obtenir l'idée.
OU vous pouvez utiliser
JsonConvert.DeserializeObject<>();
voici le code à désérialiser le
JSON.stringify()
résultatau lieu de