Подтвердить что ты не робот

ASP.NET MVC 3 - размещение сложной модели JSON для действий

Я пытаюсь опубликовать следующие данные 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}]}

Значительная часть в этом случае является свойством "Телефоны" к концу. FYI: Я получил эту строку JSON, которую я разместил здесь, вызвав JSON.stringify(profileData) в консоли javascript. В profileData - это фактический объект.

Вот вызов ajax, который создает сообщение...

$.ajax({
    url: '/Trainer/SaveProfile',
    type: 'POST',
    dataType: 'json',
    success: function (data) {
        //...
    },
    error: function (jqXHR, textStatus, errorThrown) {
        //...
    },
    data: 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; }
}

И вот объект Phone, который используется в общем списке...

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-сообщение успешно достигает метода Action, и все свойства, кроме телефонов, правильно отображаются. Объект List даже заполняется правильным количеством объектов Phone, но все они имеют значения по умолчанию для всех своих полей с нулевым или 0 или ложным. Поэтому я не уверен, что я делаю неправильно, но когда я пытаюсь заполнить список в модели из массива JSON, я получаю список правильного количества пустых объектов.

Любые идеи, что я делаю неправильно здесь?

4b9b3361

Ответ 1

Попробуйте установить правильный тип контента и убедитесь, что вы отправляете реальный запрос 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 script на вашу страницу.