Проверка уникальности с аннотациями данных в asp.net mvc - PullRequest
1 голос
/ 07 октября 2010

У меня есть различные вопросы о проверке с использованием аннотаций данных.Я использую следующую настройку

asp.net MVC 2 Entity Framework 4 аннотации данных

По сути, я пытаюсь заставить работать уникальную проверку, и я немного запутался.Мои модели следующие:

    public class Buyer
{
    public int Id { get; set; }

    [Required(ErrorMessage = "The email is required")]
    public string Email { get; set; }

    [Required(ErrorMessage= "The name is required")]
    public string Name { get; set; }
}

    public class Seller
{
    public int Id { get; set; }

    [Required(ErrorMessage = "The email is required")]
    public string Email { get; set; }

    [Required(ErrorMessage= "The name is required")]
    public string Name { get; set; }
}

Я установил уникальный атрибут поля следующим образом

public class UniqueFieldAttribute : ValidationAttribute
{
    public IUniqueValidator Validator { get; set; }
    public int Id { get; set; }

    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return true;
        }

        return Validator.IsValid(Convert.ToString(value), Id);
    }            
}

Затем я создал валидатор, который реализует интерфейс IUniqueValidator:

public class BuyerUniqueEmailValidator : IUniqueValidator
{
    public bool IsValid(string value, int id)
    {
        TheDb db = new TheDb();


        var existing = from Buyer b in db.Buyers
                       where b.Email.ToLower() == value.ToLower()
                       select b;

        foreach (Buyer b in existing)
        {
            if (b.Id != id)
            {
                return false;
            }
        }

        return true;
    }
}

Идея есть!Однако при исполнении у меня возникли проблемы.Когда я добавляю это

[UniqueField(Validator=new BuyerUniqueEmailValidator(), Id=this.Id ErrorMessage= "This email is in use")]

, проект не будет компилироваться.

По сути, я хочу знать, возможно ли передать класс в validationAttribute для выполнения проверки?Кроме того, как я могу передать идентификатор.

Кроме того, есть ли возможность создать универсальный генератор уникальных полей, который будет работать для всех моих моделей, имеющих поле электронной почты, или мне нужно иметь BuyerEmailValidator, SellerEmailValidator и т. Д. И т. Д. Я не могупохоже, что T работает правильно.

В настоящее время беспокоятся только о стороне сервера.

Спасибо

1 Ответ

0 голосов
/ 07 октября 2010

Ваша реализация кода этого не может видеть никаких записей, не видимых для ее собственной транзакции, и, следовательно, не может работать надежно в многопользовательской среде. Почему бы не использовать ограничение БД?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...