Asp.net-Mvc

ASP.NET MVC 3 - 將復雜的 JSON 模型發佈到行動

  • July 19, 2018

我正在嘗試將以下 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腳本包含到您的頁面中。

引用自:https://stackoverflow.com/questions/10110482