Mam problem z powiązaniem json z modelem widoku. Tu jest mój kodu:ASP.NET MVC 4 JSON Powiązanie z modelem widoku - błąd obiektu zagnieżdżonego
część moich ViewModels (AddressViewModel ma więcej właściwości):
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");
}
});
});
Header kontrolera:
[HttpPost]
public ActionResult SaveAddress(AddressViewModel addressViewModel)
to co Widzę z firebug:
I to jest to, co widzę w VS:
Jak widać właściwości ślizgowe są zbindowanych poprawne, ale moja zagnieżdżony obiekt (kraj) jest nieważna. Czytałem wiele różnych artykułów i nadal nie wiem, co robię źle. Pomóż mi proszę!
Po zmianie nagłówka akcji i niewielkich zmianach javascript działa! –
To nie jest tak naprawdę idiomatyczne rozwiązanie, ponieważ ominie możliwości walidacji i wiązania MVC. O wiele lepszym rozwiązaniem jest dodanie JsonModelBinder i umieszczenie tam logiki deserializacji. Jeśli można to zrobić przez przesłonięcie kilku metod w DefaultModelBinder –
Jeśli twoje wartości znajdują się wewnątrz 'formy', po prostu serializuj je i wysyłaj je z ajaxem o' contentType' z 'application/x-www-form-urlencoded; charset = UTF-8'. Jeśli nie, po prostu umieść swoje pola wejściowe za pomocą 'form action =" javascript: void (0); ">", aby można było przekształcić do postaci szeregowej na przykład [jQuery $ .serialize()] (https: //api.jquery .com/serialize /) i używać jako ładunku żądania. –