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