Пользовательская проверка с Аннотированиями данных

Я использую аннотирования данных для проверки данных, это вводится, но я застреваю когда дело доходит до большего количества пользовательского способа проверить данные.

Я должен к выполнению запросов против базы данных видеть, существует ли материал там или нет, и затем сообщите пользователю, если "пользовательская ошибка проверки дб" появляется, такие как "Companyname уже существует"

Как я могу реализовать такую вещь вместе с dataannotations?

У меня есть все запросы, сделанные и т.д. с помощью linq и платформа объекта, которая идет 3.5sp1

/M

8
задан SteveC 10 October 2013 в 17:06
поделиться

1 ответ

Custom attributes that extend data annotations

You will have to write your own attributes that will do the validation of your object instance against data store.

Make sure your classes inherit System.ComponentModel.DataAnnotations.ValidationAttribute class:

public class MustNotExist: ValidationAttribute
{
    ...
}

Caution

I've run into a similar situation when I needed to validate that the object is unique within data store. But this kind of validation wasn't possible on the entity class itself, since it should only work for those entities that are being created but not when you return your entity from the data store already.

My solution was to have a separate interface, class and attribute.

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
    ...
    public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
    ...
}

I was able to place my attribute on controller actions that get entity parameters. Filter action attribute then checks controller action parameters (it can easily access their types and values) and runs external validator against correct parameters (provided types in attribute definition) and populates ModelState errors when validation fails.

[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
    if (!this.ModelState.IsValid)
    {
        // act accordingly - probably return some error depending on model state errors
    }
    // register new user in data store
}

This way I was able to run external validation only on those actions that actually needed it, and this technique also helped my controller actions code to stay clean and short. All I had to do is to check if there are any model state errors.

12
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: