Tôi gặp vấn đề với json liên kết với mô hình khung nhìn. Đây là mã của tôi:ASP.NET MVC 4 JSON Binding vào Model View - Lỗi đối tượng lồng nhau
phần của ViewModels của tôi (AddressViewModel có nhiều thuộc tính):
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");
}
});
});
Tiêu đề của bộ điều khiển:
[HttpPost]
public ActionResult SaveAddress(AddressViewModel addressViewModel)
Đây là những gì Tôi thấy bằng firebug:
Và đây là những gì tôi nhìn thấy trong VS:
Như bạn có thể thấy một trang thuộc đồng bằng được binded đúng nhưng đối tượng lồng nhau của tôi (Quốc gia) là null. Tôi đọc rất nhiều bài báo khác nhau và tôi vẫn không biết mình đang làm gì sai. Làm ơn giúp tôi với!
Sau khi thay đổi tiêu đề hành động và ít thay đổi trong javascript, nó hoạt động! –
Đây không thực sự là một giải pháp thành ngữ vì nó sẽ bỏ qua khả năng xác nhận và ràng buộc của MVC. Một giải pháp tốt hơn là thêm một JsonModelBinder và đặt logic deserialization này vào đó. Nếu có thể được thực hiện bằng cách ghi đè một vài phương thức trong DefaultModelBinder –
Nếu các giá trị của bạn nằm trong một 'biểu mẫu', chỉ cần tuần tự hóa chúng và gửi chúng với ajax có' contentType' của 'application/x-www-form-urlencoded; charset = UTF-8'. Nếu không, chỉ cần bọc các trường nhập của bạn với một 'form action =" javascript: void (0); ">' để bạn có thể tuần tự hóa biểu mẫu với câu lệnh [jQuery $ .serialize()] (https: //api.jquery .com/serialize /) và sử dụng làm trọng tải của yêu cầu. –