我正在使用asp.net core 2.2和模型验证进行服务器端验证。 除已知类型外,它的工作情况都很好。
这是我的课程结构
//Main Class
[DataContract]
[KnownType(typeof(SubClass2))]
[KnownType(typeof(SubClass1))]
public partial class MainCass : Base
{
//properties comes here
}
//Sub Classes
[DataContract]
public partial class SubClass1 : MainCass
{
//properties comes here
}
[DataContract]
public partial class SubClass2 : MainCass
{
[DataMember]
[CustomRequired(ErrorMessageResourceType = typeof(ErrorMessages),
ErrorMessageResourceName = "FieldRequired", Caption = "name required")]
public string Name {get; set; }
}
//this is my request model
[DataContract]
public partial class request:Base
{
[DataMember]
public List<MainCass> MainCassList {get; set; }
}
现在未调用SubClass2中Name的验证属性。 我从用户界面发送Subclass2类型。
答案 0 :(得分:0)
模型绑定器不支持多态。它创建模型和所有相关子模型的文字类型。然后,它尝试将请求主体绑定到这些类型。它不会推断派生类型。
换句话说,这听起来像是在SubClass1
属性中发送SubClass2
和MainClassList
的实例。但是,模型绑定器将所有这些创建为MainClass
,因为这是定义的类型。特定于SubClass1
或SubClass2
的所有已发布数据都将被丢弃,最后,您拥有的只是MainClass
的实例。因此,由于您没有SubClass1
或SubClass2
的实例,因此当然不会在SubClass1
或SubClass2
上运行任何特定的验证。