ASP.NET MVC проверка уникальности

Рельсы имеют очень удобную проверку единственности.

ASP.NET MVC не делает.

Мне нужно убедиться, что адрес электронной почты, введенный пользователем, еще не зарегистрирован кем-либо.

Я вижу только один способ сделать такую ​​проверку: создать новый объект контекста данных в классе UniqueAttribute.

Но я боюсь, что тратить память на новый объект контекста данных только для одной проверки является опасным.

Неужели я ошибаюсь? Есть ли лучший способ сделать это?

Обновление

Это то, что я получил до сих пор

public class UniqueEmailAttribute : ValidationAttribute {
    public override bool IsValid(object value) {
        DataContext db = new DataContext();
        var userWithTheSameEmail = db.Users.SingleOrDefault(
            u => u.Email == (string)value);
        return userWithTheSameEmail == null;
    }
}

// Usage
[UniqueEmail(ErrorMessage="This e-mail is already registered")]
public string Email { get; set; }

Есть две проблемы.

  • Было бы хорошо иметь только один класс UniqueAttribute, а не отдельные классы для электронной почты, имена пользователей и т.д. Как я могу это сделать?

  • Создание контекста данных new каждый раз, когда вам нужно проверить один атрибут.

Решение

Итак, в итоге я создал уникальное ограничение для таблицы, и теперь мне просто нужно перехватить SqlException в репозитории пользователей. Отлично работает и, вероятно, более эффективен, чем поиск того же node во всей таблице. Спасибо!

Ответ 1

Простой способ сделать это - создать атрибут проверки, который будет запрашивать базу данных для адреса электронной почты. Это, безусловно, добавит задержки.

Альтернативой может быть создание уникального ограничения для таблицы и перехват SqlException.

Ответ 2

Mvc 3 У кандидата Relaease есть новые Новые Атрибуты Валидации как remotevalidation - где вы можете зарегистрировать метод проверки на clientide (jquery).

см. ниже пример- RemoteAttribute

Новый атрибут проверки RemoteAttribute использует модуль проверки правильности подключаемого модуля jQuery Validation, который позволяет проверке на стороне клиента вызывать метод на сервере, который выполняет фактическую логику проверки.

В следующем примере свойство UserName имеет примененный RemoteAttribute. При редактировании этого свойства в представлении "Редактирование" проверка клиента вызовет действие с именем UserNameAvailable в классе UsersController, чтобы проверить это поле.

public class User {  
    [Remote("UserNameAvailable", "Users")]  
    public string UserName { get; set; }  
}  

В следующем примере показан соответствующий контроллер.

public class UsersController {  
        public bool UserNameAvailable(string username) {  
            return !MyRepository.UserNameExists(username);  

       }  
   }

Mvc 3

ОБНОВЛЕНИЕ

    public bool UserNameAvailable(string Propertyname)  
    {  
        if (Request.QueryString[0]= "UserName")  
        {   
            //validate username  
        }  
        elseif (Request.QueryString[0]= "Email")  
        {  
            //Validate Email  
        }  

    }   

Ответ 3

В ASP.Net есть функция, которая может автоматически проверять уникальность адреса электронной почты пользователя, когда пользователь регистрируется. Это сервис ASP.Net Membership, и вы можете использовать его для выполнения того, что хотите, даже если вы не используете все его функции.

Если вы не используете полнофункциональную функцию членства в своем приложении MVC, все, что вам нужно сделать, это использовать

Membership.FindUsersByEmail(emailYouAreLookingFor);

Если значения возвращаются, вы знаете, что адрес не уникален. Если вы используете службу членства для создания пользователей, служба членства проверяет AUTOMATICALLY и возвращает код вам, если адрес электронной почты пользователя не уникален.

Служба членства находится в области System.Web.Security, поэтому вам понадобится

с использованием System.Web.Security;

в вашем контроллере.

Вот пример

            MembershipCreateStatus createStatus = MembershipService.CreateUser(UserName, Password, Email);

            if (createStatus == MembershipCreateStatus.DuplicateEmail)
            {

                   //do something here
            }
            else
            {
                   //do something here

            }

Надеюсь, это поможет!

Ответ 4

Правильный способ создания универсального удаленного уникального валидатора в MVC можно найти в этом форуме MVC. от advsellorben. Это основано на моей уникальной удаленной статье проверки достоверности MVC http://msdn.microsoft.com/en-us/library/gg508808(VS.98).aspx