2010-11-28 3 views
10

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

ASP.NET MVC нет.

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

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

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

Я не прав? Есть ли лучший способ сделать это?

Update

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

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 в хранилище пользователей. Отлично работает и, вероятно, более эффективен, чем поиск одного и того же узла во всей таблице. Благодаря!

+2

Rails vs ASP.NET MVC похож на сравнение яблок с апельсинами, они не одно и то же. ASP.NET MVC не имеет формального уровня сохранения данных, вам нужно выбрать один из множества, и бороться с этим – TFD 2010-11-28 20:36:27

+0

@TFD, это хороший момент. Я согласен, что нет слоя данных, поэтому DataContext нужно где-то хранить, вот о чем мой вопрос. – Alex 2010-11-28 20:39:01

+0

1] По умолчанию имя свойства, к которому применяется атрибут, отправляется методу действия в качестве параметра строки запроса. – swapneel 2010-11-28 20:58:12

ответ

1

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

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

7

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

UPDATE

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

    } 
2

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 

      } 

Я надеюсь, что это помогает!