Подтвердить что ты не робот

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 во всей таблице. Спасибо!

4b9b3361

Ответ 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