asp.net-mvc – ASP.NET MVC 3 – 将复杂的JSON模型发布到操作

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.NET MVC 3 – 将复杂的JSON模型发布到操作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将以下 JSON数据发布到我的控制器上的Action方法
  1. {"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}]}

在这种情况下,重要的部分是“手机”财产.
FYI:我通过在JavaScript控制台中调用JSON.stringify(profileData)获得了我在此发布的JSON字符串. profileData是一个实际的对象.

这是ajax电话正在发布…

  1. $.ajax({
  2. url: '/Trainer/SaveProfile',type: 'POST',dataType: 'json',success: function (data) {
  3. //...
  4. },error: function (jqXHR,textStatus,errorThrown) {
  5. //...
  6. },data: profileData
  7. });

profileData是我上面发布的JSON.

这是我使用AJAX帖子调用的Action的方法签名…

  1. [HttpPost]
  2. public ActionResult SaveProfile(TrainerEditModel model)

这里是TrainerEditModel(抱歉这么大)…

  1. public class TrainerEditModel
  2. {
  3. public TrainerEditModel()
  4. {
  5. Phones = new List<Phone>();
  6. }
  7.  
  8. [Display(Name = "Trainer Id")]
  9. public Int32 Id { get; set; }
  10.  
  11. [Display(Name = "Vendor Id")]
  12. [required(ErrorMessage = "Vendor ID is required.")]
  13. public Int32? VendorId { get; set; }
  14.  
  15. [Display(Name = "First Name")]
  16. [required(ErrorMessage = "First Name is required.")]
  17. public String FirstName { get; set; }
  18.  
  19. [Display(Name = "Last Name")]
  20. [required(ErrorMessage = "Last Name is required.")]
  21. public String LastName { get; set; }
  22.  
  23. public String Address { get; set; }
  24.  
  25. public String City { get; set; }
  26.  
  27. public String State { get; set; }
  28.  
  29. [Display(Name = "Postal Code")]
  30. public String PostCode { get; set; }
  31.  
  32. public String Country { get; set; }
  33.  
  34. [DataType(DataType.EmailAddress,ErrorMessage = "Must be a valid email address.")]
  35. public String Email { get; set; }
  36.  
  37. [Display(Name = "Airport City")]
  38. [required(ErrorMessage = "Airport City is required.")]
  39. public String AirportCity { get; set; }
  40.  
  41. [Display(Name = "Airport State")]
  42. [required(ErrorMessage = "Airport State is required.")]
  43. public String AirportState { get; set; }
  44.  
  45. [Display(Name = "Currency Code")]
  46. [required(ErrorMessage = "Currency Code is required.")]
  47. public String CurrencyCode { get; set; }
  48.  
  49. [Display(Name = "US Tax Id")]
  50. [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.")]
  51. public String UsTaxId { get; set; }
  52.  
  53. [Display(Name = "Foreign Tax Id")]
  54. public String ForeignTaxId { get; set; }
  55.  
  56. [Display(Name = "Tax Exempt California")]
  57. public Boolean TaxExemptCalifornia { get; set; }
  58.  
  59. [Display(Name = "Tax Exempt Canada")]
  60. public Boolean TaxExemptCanada { get; set; }
  61.  
  62. [Display(Name = "GST Number")]
  63. public String GstNumber { get; set; }
  64.  
  65. [Display(Name = "Gender")]
  66. [required(ErrorMessage = "Gender is required.")]
  67. public String Sex { get; set; }
  68.  
  69. [Display(Name = "Date of Birth")]
  70. [DataType(DataType.Date,ErrorMessage = "Must be a valid date.")]
  71. public DateTime? DateOfBirth { get; set; }
  72.  
  73. [Display(Name = "Date Contracted")]
  74. [DataType(DataType.Date,ErrorMessage = "Must be a valid date.")]
  75. public DateTime? DateContracted { get; set; }
  76.  
  77. [Display(Name = "Date Terminated")]
  78. [DataType(DataType.Date,ErrorMessage = "Must be a valid date.")]
  79. public DateTime? DateTerminated { get; set; }
  80.  
  81. [Display(Name = "Termination Status")]
  82. public String TerminationStatus { get; set; }
  83.  
  84. [Display(Name = "First Seminar Date")]
  85. [DataType(DataType.Date,ErrorMessage = "Must be a valid date.")]
  86. public DateTime? FirstSeminarDate { get; set; }
  87.  
  88. [Display(Name = "First On Site Date")]
  89. [DataType(DataType.Date,ErrorMessage = "Must be a valid date.")]
  90. public DateTime? FirstOnsiteDate { get; set; }
  91.  
  92. [Display(Name = "Last Seminar Date")]
  93. [DataType(DataType.Date,ErrorMessage = "Must be a valid date.")]
  94. public DateTime? LastSeminarDate { get; set; }
  95.  
  96. [Display(Name = "Date Certified")]
  97. [DataType(DataType.Date,ErrorMessage = "Must be a valid date.")]
  98. public DateTime? DateCertified { get; set; }
  99.  
  100. [Display(Name = "Certification Call")]
  101. public DateTime? CertificationCall { get; set; }
  102.  
  103. [Display(Name = "Certification Materials")]
  104. public DateTime? CertificationMaterials { get; set; }
  105.  
  106. [Display(Name = "Faculty Trainer")]
  107. public String FacultyTrainer { get; set; }
  108.  
  109. [Display(Name = "Passport Issued")]
  110. public DateTime? PassportIssued { get; set; }
  111.  
  112. [Display(Name = "Passport Expired")]
  113. public DateTime? PassportExpired { get; set; }
  114.  
  115. [Display(Name = "TN Visa")]
  116. public Boolean TnVisa { get; set; }
  117.  
  118. [Display(Name = "Brochure Permission")]
  119. public Boolean BrochurePermission { get; set; }
  120.  
  121. public List<Phone> Phones { get; set; }
  122. }

这里是通用列表中使用的Phone对象…

  1. public class Phone : IHaveAnId
  2. {
  3. public Int32 Id { get; set; }
  4. public String Type { get; set; }
  5. public String Number { get; set; }
  6. public Boolean IsPrimary { get; set; }
  7.  
  8. public virtual Trainer Trainer { get; set; }
  9. }

所以,这是问题. HTTP Post已成功达到Action方法,除Phones之外的所有属性正确映射. List对象甚至使用正确数量的Phone对象填充,但它们都在null或0或false的所有字段上都有默认值.所以我不知道我做错了什么,但是当我尝试从一个JSON数组中填充一个模型列表时,我得到一个正确数量的空白对象的列表.

任何想法我在这里做错什么?

解决方法

尝试设置正确的内容类型,并确保您正在发送一个真正的JSON请求(使用JSON.stringify方法):
  1. var profileData = {"Id":"0","IsPrimary":false}]}
  2.  
  3. $.ajax({
  4. url: '/Trainer/SaveProfile',contentType: 'application/json',data: JSON.stringify({ model: profileData }),errorThrown) {
  5. //...
  6. }
  7. });

JSON.stringify本来是内置于现代浏览器中的,但如果您需要支持旧版浏览器,则可以将json2.js脚本包含在您的页面中.

猜你在找的asp.Net相关文章