#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’, то это не сработает (хотя он по-прежнему десериализуется правильно). Я чувствую, что это ошибка или, по крайней мере, несоответствие.