代码之家  ›  专栏  ›  技术社区  ›  xr280xr

ASP.NET MVC模型绑定未设置继承列表的类型的属性<T>

  •  0
  • xr280xr  · 技术社区  · 7 年前

    我有一个带有集合属性的ViewModel。我想要那个收藏类型,它最初是一个 List<T> 因此我创建了一个继承自的类 列表<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; }
    }
    

    包含列表的VM(为简洁起见,省略了额外属性):

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

    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 密钥已提交,我可以在VisualStudio中看到该请求。表单也包括该密钥。默认绑定器是否看到它是一个列表而忽略它是一个派生类型的事实?有趣的是,在“监视”窗口中或将鼠标悬停在vm上时,VisualStudio也会忽略虚拟机上的其他属性 AvailablePaymentPlans ClassEnrollmentForm 作为基类 List<ClassEnrollmentPaymentPlanVM> . 这是使用.NETFramework 4.6.2

    0 回复  |  直到 7 年前