2012-04-11 28 views
13

我想下面的JSON数据发布到我的控制器上的操作方法......ASP.NET MVC 3 - 在这种情况下,发布复杂的JSON模式来操作

{"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方法,并且除电话之外的所有属性都正确映射。 List对象甚至填充了正确数量的Phone对象,但它们的所有字段都为null或0或false的默认值。所以我不知道我做错了什么,但是当我尝试从JSON数组填充模型中的列表时,我得到了正确数量的空白对象的列表。

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

回答

20

尝试设置正确的内容类型,并确保您发送的是真正的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脚本。

+4

contentType:'application/json'修复了我的问题! – Scottie 2012-11-27 03:27:29

+0

我的问题也是缺少的内容类型 – Gnomo 2013-01-10 19:43:04

+0

这帮了我很多。我放弃了“传统:真正的”来模仿你的语法,并突然发挥作用。奇怪,但救济。 – 2013-05-31 18:29:51