Как работают аннотации данных?
Я использую аннотации данных в моем проекте ASP.NET MVC 3 для проверки модели. Это очень удобно, но в настоящее время они для меня волшебны. Я читал, что аннотации данных не генерируют исключений. Как известно MVC добавить ошибки проверки в словарь состояния модели? Как не удается установить свойство на модели из-за того, что валидация модели пузырится до MVC, если исключение не выбрасывается? Я всегда предполагал, что исключения были выброшены каждый раз, когда свойство не удалось, и что привязка модели MVC поймала исключение и добавила его в словарь состояния модели.
Чтобы проверить это, я создал консольное приложение и добавил класс образца с аннотацией проверки:
public class MyObject
{
[StringLength(10, MinimumLength=3)]
public string Name { get; set; }
}
Затем я создал объект и попытался присвоить значения свойства Name, которые были меньше 3. Свойство, назначенное просто отлично, несмотря на аннотацию, в которой указано, что длина строки меньше 3 не разрешена.
static void Main(string[] args)
{
MyObject mine = new MyObject();
mine.Name = "hi";
Console.WriteLine(mine.Name);
Console.ReadLine();
}
Эта небольшая программа записывает "привет" на консоль. Зачем? Я ожидал, что он разозлится при попытке установить mine.Name
на "привет".
Что мне не хватает?
Спасибо заранее.
Ответы
Ответ 1
Вы никогда не вызываете ничего, чтобы проверить свойства. Проверка не происходит волшебным образом сама по себе. от http://msdn.microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx
Вручную проверять значения
Если вы не используете DataGrid управления для обеспечения интерфейса для редактирование данных, проверка атрибуты не автоматически применяется. Однако вы можете вручную применить проверку проверки, используя Validator
класс. Вы можете позвонить ValidateProperty
на множестве аксессуар объекта для проверки значение против валидации атрибуты для свойства. Вы должны также установите оба ValidatesOnExceptions
и NotifyOnValidationError
свойства true, когда привязка данных для получения исключения проверки из проверки атрибутов. Пример вручную. применение валидации, см. данные Пример привязки ниже.
Ответ 2
С# предоставляет механизм для определения декларативных тегов, называемых атрибуты, которые вы можете разместить на определенных объектах в вашем источнике код для указания дополнительной информации. Информация, которая атрибуты могут быть извлечены во время выполнения через отражение.
https://msdn.microsoft.com/en-us/library/aa288059(v=vs.71).aspx
Вот три статьи, которые помогут расширить ваши знания о том, как работают атрибуты. Последнее является наименее важным, если вы понимаете, как их использовать. Статья предназначена для Silverlight, но по-прежнему применима к данной теме.
Введение в атрибуты
Атрибуты
DataTypeAttributes
Использование аннотаций данных w/silverlight
Ответ 3
Как тогда MVC знает, чтобы добавить ошибки проверки в состояние модели словарь?
ModelValidatorProvider, а именно DataAnnotationsModelValidatorProvider. Это вызвано MVC.
Ответ 4
потому что вы не проверяете, действительно ли модель... нотация данных проверяет правильность модели. то вы получите свою ошибку.