次の 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
}
]
}
この場合の重要な部分は、最後にある "Phones" プロパティです。参考: 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; }
}
そして、これが一般的なリストで使用される 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 Post は正常に Action メソッドに到達しており、Phones を除くすべてのプロパティが正しくマッピングされています。List オブジェクトには正しい数の Phone オブジェクトが取り込まれていますが、すべてのフィールドのデフォルト値が null または 0 または false になっています。したがって、何が間違っているのかわかりませんが、JSON 配列からモデルにリストを作成しようとすると、正しい数の空のオブジェクトのリストが取得されます。
ここで私が間違っていることはありますか?