2012-04-11 19 views
13

que estoy tratando de publicar los siguientes datos JSON a un método de acción en mi controlador ...ASP.NET MVC 3 - publicar modelo JSON complejo a la acción

{"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 importante en este caso es el Propiedad "Phones" hacia el final. FYI: Obtuve esta cadena JSON que publiqué aquí llamando a JSON.stringify (profileData) en la consola de JavaScript. En profileData es un objeto real.

Aquí está la llamada AJAX que está haciendo el post ...

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

Con profileData ser el JSON que he publicado anteriormente.

Aquí está la firma del método para la Acción que estoy llamando con el puesto AJAX ...

[HttpPost] 
public ActionResult SaveProfile(TrainerEditModel model) 

Aquí es TrainerEditModel (Lo siento es tan 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; } 
} 

Y aquí es el objeto Phone que se utiliza en la lista genérica ...

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

Así que aquí está el problema. La publicación HTTP está alcanzando con éxito el método de acción y todas las propiedades, a excepción de los teléfonos, se están asignando correctamente. El objeto List incluso se está completando con la cantidad correcta de objetos Phone, pero todos tienen valores predeterminados en todos sus campos de nulo o 0 o falso. Así que no estoy seguro de lo que estoy haciendo mal, pero cuando intento completar una Lista en un Modelo de una matriz JSON obtengo una Lista de la cantidad correcta de objetos en blanco.

¿Alguna idea de lo que estoy haciendo mal aquí?

Respuesta

20

Pruebe a establecer el tipo de contenido adecuado y asegurarse de que está enviando una petición real de JSON (usando el método 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) { 
     //... 
    } 
}); 

El JSON.stringify se construye de forma nativa en los navegadores modernos, pero si necesita ayuda de la herencia navegadores puede incluir el script json2.js en su página.

+4

contentType: 'application/json' solucionó mi problema! – Scottie

+0

mi problema también era el tipo de contenido faltante – Gnomo

+0

esto me ayudó mucho. Dejé 'tradition: true' para parecerse exactamente a tu sintaxis y de repente funcionó. Extraño, pero alivio. –

Cuestiones relacionadas