ASP.NET MVC проверка уникальности - PullRequest
12 голосов
/ 28 ноября 2010

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

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; }

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

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

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

РЕШЕНИЕ

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

Ответы [ 4 ]

7 голосов
/ 28 ноября 2010

Mvc 3 Relaease кандидата имеет новые новые атрибуты проверки в качестве удаленной проверки, где вы можете зарегистрировать метод для проверки на стороне клиента (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

UPDATE

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

    }   
2 голосов
/ 04 мая 2012

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

2 голосов
/ 29 ноября 2010

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

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

Membership.FindUsersByEmail (emailYouAreLookingFor);

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

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

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

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

Вот пример

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

            if (createStatus == MembershipCreateStatus.DuplicateEmail)
            {

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

            }

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

1 голос
/ 28 ноября 2010

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

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

...