Является ли DataTypeAttribute атрибутом проверки для класса DefaultModelBinder

Я только что заметил, что DataTypeAttribute класс наследуется от System.ComponentModel.DataAnnotations.ValidationAttribute,

С точки зрения ASP.NET MVC DefaultModelBinder класс, это DataTypeAttribute такое атрибут проверки? Проще говоря, проверяет ли ModelBinder объект в соответствии с DataTypeAttribute?

Например, если я укажу DataType собственность на DataType.EmailAddress, будет ли он проверять адрес электронной почты или этот атрибут предоставляет только метаданные для объектов.

ОБНОВИТЬ

Я нашел похожий вопрос на SO:

Работает ли валидация DataTypeAttribute в MVC2?

Таким образом, в соответствии с этим он не работает в качестве атрибута проверки. Итак, почему он унаследован от System.ComponentModel.DataAnnotations.ValidationAttribute если он не служит атрибутом проверки?

2 ответа

Решение

DataTypeAttribute не содержит никакой логики валидации.

Причина, по которой он вытекает из ValidationAttribute, заключается в том, что вы можете создать новый класс пользовательских типов данных, который был одновременно DataType и Validation, все они объединены в один. Это нежелательный побочный эффект.NET, не допускающий множественное наследование.

Так что да, это валидатор... который по умолчанию не выполняет валидацию. Он терпеливо ждет, когда вы сделаете тяжелую работу.:)

На самом деле, если вы загляните внутрь MVC 3 Futures, вы увидите, что мы использовали это для создания новых пользовательских валидаторов, где мы знали, что jQuery уже способен предоставлять логику проверки на стороне клиента, и мы добавили зеркальную логику проверки на стороне сервера (и сохранил преимущества DataType для шаблонов).

На основе исходного кода MVC3 единственная цель DataTypeAttribute это заполнить ModelMetadata.DataTypeName свойство. И это свойство используется только при генерации шаблона EditorFor/DisplayFor. Таким образом, вы были правы, это не имеет ничего общего с проверкой. Так что я не знаю, почему он унаследован от ValidationAttribute, Возможно, авторы фреймворка зарезервировали его для будущего использования.

Другие вопросы по тегам