Asp.net-Mvc
ASP.NET MVC 3 - 將復雜的 JSON 模型發佈到行動
我正在嘗試將以下 JSON 數據發佈到我的控制器上的 Action 方法…
{ "Id": "0", "VendorId": "5", "FirstName": "g", "LastName": "g", "Sex": "m", "DateOfBirth": "", "Address": "", "City": "", "State": "", "PostCode": "", "Country": "", "Email": "", "AirportCity": "s", "AirportState": "s", "CurrencyCode": "1", "UsTaxId": "", "ForeignTaxId": "", "GstNumber": "", "TaxExemptCalifornia": false, "TaxExemptCanada": false, "DateContracted": "", "DateTerminated": "", "TerminationStatus": "", "FirstSeminarDate": "", "FirstOnsiteDate": "", "LastSeminarDate": "", "DateCertified": "", "CertificationCall": "", "CertificationMaterials": "", "FacultyTrainer": "", "PassportIssued": "", "PassportExpired": "", "TnVisa": false, "BrochurePermission": false, "Phones": [{ "Id": 0, "Type": "cell", "Number": "222-333-4444", "IsPrimary": false }, { "Id": 0, "Type": "home", "Number": "333-444-5555", "IsPrimary": false } ]}
在這種情況下,重要的部分是最後的“電話”屬性。僅供參考:我通過在 javascript 控制台中呼叫 JSON.stringify(profileData) 獲得了我在此處發布的這個 JSON 字元串。在 profileData 中是一個實際的對象。
這是發布文章的ajax呼叫…
$.ajax({ url: '/Trainer/SaveProfile', type: 'POST', dataType: 'json', success: function (data) { //... }, error: function (jqXHR, textStatus, errorThrown) { //... }, data: profileData });profileData 是我在上面發布的 JSON。
這是我使用 AJAX 文章呼叫的操作的方法簽名…
[HttpPost] public ActionResult SaveProfile(TrainerEditModel model)這是 TrainerEditModel(對不起,它太大了)…
public class TrainerEditModel { public TrainerEditModel() { Phones = new List<Phone>(); } [Display(Name = "Trainer Id")] public Int32 Id { get; set; } [Display(Name = "Vendor Id")] [Required(ErrorMessage = "Vendor ID is required.")] public Int32? VendorId { get; set; } [Display(Name = "First Name")] [Required(ErrorMessage = "First Name is required.")] public String FirstName { get; set; } [Display(Name = "Last Name")] [Required(ErrorMessage = "Last Name is required.")] public String LastName { get; set; } public String Address { get; set; } public String City { get; set; } public String State { get; set; } [Display(Name = "Postal Code")] public String PostCode { get; set; } public String Country { get; set; } [DataType(DataType.EmailAddress, ErrorMessage = "Must be a valid email address.")] public String Email { get; set; } [Display(Name = "Airport City")] [Required(ErrorMessage = "Airport City is required.")] public String AirportCity { get; set; } [Display(Name = "Airport State")] [Required(ErrorMessage = "Airport State is required.")] public String AirportState { get; set; } [Display(Name = "Currency Code")] [Required(ErrorMessage = "Currency Code is required.")] public String CurrencyCode { get; set; } [Display(Name = "US Tax Id")] [RegularExpression(@"^\d{3}-\d{2}-\d{4}$|^\d{2}-\d{7}$", ErrorMessage = "US Tax Id must be a valid Social Security Number or Tax ID.")] public String UsTaxId { get; set; } [Display(Name = "Foreign Tax Id")] public String ForeignTaxId { get; set; } [Display(Name = "Tax Exempt California")] public Boolean TaxExemptCalifornia { get; set; } [Display(Name = "Tax Exempt Canada")] public Boolean TaxExemptCanada { get; set; } [Display(Name = "GST Number")] public String GstNumber { get; set; } [Display(Name = "Gender")] [Required(ErrorMessage = "Gender is required.")] public String Sex { get; set; } [Display(Name = "Date of Birth")] [DataType(DataType.Date, ErrorMessage = "Must be a valid date.")] public DateTime? DateOfBirth { get; set; } [Display(Name = "Date Contracted")] [DataType(DataType.Date, ErrorMessage = "Must be a valid date.")] public DateTime? DateContracted { get; set; } [Display(Name = "Date Terminated")] [DataType(DataType.Date, ErrorMessage = "Must be a valid date.")] public DateTime? DateTerminated { get; set; } [Display(Name = "Termination Status")] public String TerminationStatus { get; set; } [Display(Name = "First Seminar Date")] [DataType(DataType.Date, ErrorMessage = "Must be a valid date.")] public DateTime? FirstSeminarDate { get; set; } [Display(Name = "First On Site Date")] [DataType(DataType.Date, ErrorMessage = "Must be a valid date.")] public DateTime? FirstOnsiteDate { get; set; } [Display(Name = "Last Seminar Date")] [DataType(DataType.Date, ErrorMessage = "Must be a valid date.")] public DateTime? LastSeminarDate { get; set; } [Display(Name = "Date Certified")] [DataType(DataType.Date, ErrorMessage = "Must be a valid date.")] public DateTime? DateCertified { get; set; } [Display(Name = "Certification Call")] public DateTime? CertificationCall { get; set; } [Display(Name = "Certification Materials")] public DateTime? CertificationMaterials { get; set; } [Display(Name = "Faculty Trainer")] public String FacultyTrainer { get; set; } [Display(Name = "Passport Issued")] public DateTime? PassportIssued { get; set; } [Display(Name = "Passport Expired")] public DateTime? PassportExpired { get; set; } [Display(Name = "TN Visa")] public Boolean TnVisa { get; set; } [Display(Name = "Brochure Permission")] public Boolean BrochurePermission { get; set; } public List<Phone> Phones { get; set; } }這是在通用列表中使用的電話對象…
public class Phone : IHaveAnId { public Int32 Id { get; set; } public String Type { get; set; } public String Number { get; set; } public Boolean IsPrimary { get; set; } public virtual Trainer Trainer { get; set; } }所以,這就是問題所在。HTTP Post 成功到達 Action 方法,並且除 Phones 之外的所有屬性都正確映射。List 對象甚至填充了正確數量的 Phone 對象,但它們的所有欄位都具有預設值,即 null 或 0 或 false。所以我不確定我做錯了什麼,但是當我嘗試從 JSON 數組中填充模型中的列表時,我得到了正確數量的空白對象的列表。
有什麼想法我在這裡做錯了嗎?
嘗試設置正確的內容類型並確保您發送的是真正的 JSON 請求(使用
JSON.stringify方法):var profileData = {"Id":"0","VendorId":"5","FirstName":"g","LastName":"g","Sex":"m","DateOfBirth":"","Address":"","City":"","State":"","PostCode":"","Country":"","Email":"","AirportCity":"s","AirportState":"s","CurrencyCode":"1","UsTaxId":"","ForeignTaxId":"","GstNumber":"","TaxExemptCalifornia":false,"TaxExemptCanada":false,"DateContracted":"","DateTerminated":"","TerminationStatus":"","FirstSeminarDate":"","FirstOnsiteDate":"","LastSeminarDate":"","DateCertified":"","CertificationCall":"","CertificationMaterials":"","FacultyTrainer":"","PassportIssued":"","PassportExpired":"","TnVisa":false,"BrochurePermission":false,"Phones":[{"Id":0,"Type":"cell","Number":"222-333-4444","IsPrimary":false},{"Id":0,"Type":"home","Number":"333-444-5555","IsPrimary":false}]} $.ajax({ url: '/Trainer/SaveProfile', type: 'POST', dataType: 'json', contentType: 'application/json', data: JSON.stringify({ model: profileData }), success: function (data) { //... }, error: function (jqXHR, textStatus, errorThrown) { //... } });原生
JSON.stringify內置於現代瀏覽器中,但如果您需要支持舊版瀏覽器,您可以將json2.js腳本包含到您的頁面中。