У меня есть ViewModel со свойством коллекции.Я хотел, чтобы у этого типа коллекции, который изначально был List<T>
, были дополнительные свойства, поэтому я создал класс, который наследуется от List<T>
, и определил свойства для него.Когда я публикую свое действие контроллера, одно из этих свойств (единственное, которое я публикую) не устанавливается, хотя опубликованное имя мне кажется правильным.
Класс списка:
public class ClassEnrollmentPaymentPlanVMList : List<ClassEnrollmentPaymentPlanVM>
{
public Guid StudentID { get; set; }
public Guid ClassEventID { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
[Required]
public Guid SelectedPricePlanID { get; set; }
}
Виртуальная машина, содержащая список (для краткости опущены дополнительные свойства):
public class ClassEnrollmentFormVM
{
public Guid StudentID { get; set; }
public Guid ClassEventID { get; set; }
[Required]
public DateTime? StartDate { get; set; }
[Required]
public DateTime? EndDate { get; set; }
public ClassEnrollmentPaymentPlanVMList AvailablePaymentPlans { get; set; }
}
Контроллер:
[HttpPost]
public ActionResult GetClassPaymentPlans(ClassEnrollmentFormVM vm)
{
AjaxResponse response = new AjaxResponse();
...
return response.ToContentResult();
}
AJAX-запись в GetClassPaymentPlans (извлечено из инструментов Chrome dev.URL расшифрован):
StudentID: 6267cacc-c5c3-41d8-bd77-65bd8be31b7f
ClassEventID: 20d1d0e3-e6fc-4603-b7cc-8373b3d22527
StartDate: 10/3/2018 12:00:00 AM
EndDate: 5/8/2019 12:00:00 AM
AvailablePaymentPlans[0].PricePlanID: 329f138e-cf9b-427c-b944-75304510caa9
AvailablePaymentPlans[0].ScheduledPayments[0].DueDate: 12/27/2018
AvailablePaymentPlans[1].PricePlanID: c3924757-861f-4456-bde5-782ba2759546
AvailablePaymentPlans[1].ScheduledPayments[0].DueDate: 12/27/2018
AvailablePaymentPlans.SelectedPricePlanID: c3924757-861f-4456-bde5-782ba2759546
AvailablePaymentPlans[2].PricePlanID: 64e622f8-6bec-48c7-96b8-faee3fc17832
AvailablePaymentPlans[2].ScheduledPayments[0].DueDate: 12/27/2018
AvailablePaymentPlans[2].ScheduledPayments[1].DueDate: 1/2/2019
AvailablePaymentPlans[2].ScheduledPayments[2].DueDate: 2/2/2019
AvailablePaymentPlans[2].ScheduledPayments[3].DueDate: 3/5/2019
AvailablePaymentPlans[2].ScheduledPayments[4].DueDate: 4/5/2019
AvailablePaymentPlans[2].ScheduledPayments[5].DueDate: 5/6/2019
Но vm.AvailablePaymentPlans.SelectedPricePlanID
равно {00000000-0000-0000-0000-000000000000}
, когда оно достигает GetClassEnrollmentForm
.Сначала я подумал, что, возможно, это не публикация, потому что элементы скрыты, но вы можете видеть выше, что отправляется ключ AvailablePaymentPlans.SelectedPricePlanID
, и я вижу в Visual Studio, что Request.Form также включает этот ключ.Видит ли связыватель по умолчанию, что это список, и игнорирует тот факт, что это производный тип?Интересно, что в окне Watch или при наведении курсора на vm Visual Studio также игнорирует дополнительные свойства в AvailablePaymentPlans
и не показывает их, но intellisense предлагает их так, как если бы свойство было объявлено в ClassEnrollmentForm
в качестве базового класса List<ClassEnrollmentPaymentPlanVM>
.Это использует .NET Framework 4.6.2