MVC2: Использование DataAnnotations для проверки DataType - PullRequest
2 голосов
/ 10 ноября 2010

Я использую Entity Framework + БД SQL Server и использую частичные классы с DataAnnotations для проверки данных. Для таких вещей, как Required и Range, это работает нормально, но я не могу заставить работать валидаторы DataType.

Вот пример (пользовательской) аннотации:

[DataTypeWholeNumberAttribute(ErrorMessage = "Zip must be a whole number")]
public object Zip{ get; set; }

... и код контроллера ...

[HttpPost]   
public ActionResult Edit(NamedInsuredViewModel viewModel)   
{   
    try  
    { //breakpoint here (opening squiggly bracket) shows .Zip is already null   
        if (ModelState.IsValid)   
        ...save, etc...
    }
}

И я знаю, что происходит: DataType Zip в базе данных int, поэтому проверка по умолчанию улавливает это и применяет общее сообщение об ошибке «значение [x] недопустимо для [FieldName]», прежде чем мой валидатор добраться до него (чтобы доказать это, я также добавил тот же валидатор в строковое поле, и он работает просто отлично). Чего я не знаю, как я могу обойти это (и нет, я не могу изменить БД, чтобы использовать строки для всего)?

В этом посте были предложены некоторые предложения (http://forums.asp.net/p/1608322/4162819.aspx#4162819),, но пока ничего не помогло.

Заранее спасибо.

PS - действительно ли нет способа проверить примитивный тип данных без создания пользовательского атрибута?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2010

Примените свой пользовательский валидатор к классу.Затем передайте экземпляр вашего класса в качестве параметра для вашего валидатора, а не в виде строки.Затем вы можете выполнить проверку соответствующего свойства независимо от типа.

0 голосов
/ 11 ноября 2010

Я думаю, что ошибка состоит в том, что передается что-то, называемое viewModel, в действие редактирования. ViewModel предназначен для передачи данных в представление для их отображения. Когда вы отправляете форму, данные должны быть сопоставлены с сущностью, а не с моделью представления.

[HttpPost]   
public ActionResult Edit(YourEntity entity)   
{   
    try  
    { //breakpoint here (opening squiggly bracket) shows .Zip is already null   
        if (ModelState.IsValid)   
        ...save, etc...
    }
}
...