2012-04-11 20 views
13

Sto cercando di inviare i seguenti dati JSON ad un metodo d'azione sul mio controller ...ASP.NET MVC 3 - la pubblicazione del modello JSON complesso all'azione

{"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}]} 

Con la parte significativa in questo caso è il Proprietà "Telefoni" verso la fine. FYI: Ho ottenuto questa stringa JSON che ho postato qui chiamando JSON.stringify (profileData) nella console javascript. In profileData è un oggetto reale.

Ecco la chiamata AJAX che sta facendo il post ...

$.ajax({ 
    url: '/Trainer/SaveProfile', 
    type: 'POST', 
    dataType: 'json', 
    success: function (data) { 
     //... 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     //... 
    }, 
    data: profileData 
}); 

Con profileData essere il JSON che ho postato qui sopra.

Ecco la firma del metodo per l'azione che chiamo con il post AJAX ...

[HttpPost] 
public ActionResult SaveProfile(TrainerEditModel model) 

Ecco TrainerEditModel (Ci dispiace è così grande) ...

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; } 
} 

E qui è l'oggetto Phone che viene utilizzato nell'elenco generico ...

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; } 
} 

Quindi, ecco il problema. L'HTTP Post sta raggiungendo con successo il metodo Action e tutte le proprietà tranne Phones stanno mappando correttamente. L'oggetto List viene persino popolato con il numero corretto di oggetti Phone, ma tutti hanno valori predefiniti su tutti i loro campi di null o 0 o false. Quindi non sono sicuro di cosa sto facendo male, ma quando provo a compilare un elenco in un modello da un array JSON sto ricevendo un elenco del numero corretto di oggetti vuoti.

Qualche idea su cosa sto facendo male qui?

risposta

20

Prova a impostare il tipo di contenuto corretto e assicurarsi che si sta inviando una richiesta vera e propria JSON (utilizzando il metodo 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) { 
     //... 
    } 
}); 

Il JSON.stringify è nativamente integrato nel browser moderni, ma se è necessario supportare l'eredità browser è possibile includere lo script json2.js nella pagina.

+4

contentType: "application/json" ha risolto il problema! – Scottie

+0

il mio problema era anche il contenuto mancanteTipo – Gnomo

+0

questo mi ha aiutato molto. Ho abbandonato 'tradition: true' per assomigliare esattamente alla tua sintassi e improvvisamente ha funzionato. Strano, ma sollievo. –

Problemi correlati