Проверка модели не работает для производных классов. несмотря на то, что я упомянул известные типы

#asp.net-core-2.0 #model-validation #known-types

#asp.net-core-2.0 #модель-проверка #известные типы

Вопрос:

Я использую asp.net ядро 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; }    
    }    
  

теперь атрибут проверки Name в SubClass2 не вызывается.
Из пользовательского интерфейса я отправляю тип Subclass2.

Ответ №1:

Model binder не поддерживает полиморфизм. Это создает литеральный тип (ы) модели и любых связанных с ней подмоделей. Затем он пытается привязать тело запроса к этим типам. Это не приведет к выводу производных типов.

Другими словами, это звучит так, как будто вы отправляете экземпляры SubClass1 и SubClass2 как часть вашего MainClassList свойства. Однако model binder собирается создать все это как MainClass , потому что это определенный тип. Любые опубликованные данные, относящиеся к SubClass1 or SubClass2 , будут просто отброшены, и в итоге все, что у вас есть, — это экземпляры MainClass . Как таковая, конечно, никакая конкретная проверка для SubClass1 or SubClass2 не выполняется, потому что у вас нет экземпляров SubClass1 or SubClass2 .

Комментарии:

1. есть ли решение для преодоления этого?

2. Нет. Это функциональное ограничение привязки модели. Полиморфизм — это полный запрет. Лучшее, что вы можете сделать, это создать модель представления, которая охватывает все производные классы, так что любое свойство для любого производного типа может быть привязано, а затем сопоставлено соответствующему производному типу с помощью какой-либо условной проверки.

3. Я застрял на этой проблеме весь день. Asp net core 3.1 корректно реализует проверку для производных типов, если они не находятся в списке / массиве. Я использую библиотеку JsonSubTypes для десериализации, и я могу видеть правильные типы, поступающие через мой контроллер. С контроллером ‘subClass’ с одним значением это работает, но если вы попытаетесь отправить список ‘subClass’, то это не сработает (хотя он по-прежнему десериализуется правильно). Я чувствую, что это ошибка или, по крайней мере, несоответствие.