2012-02-20 2 views
1

Я пытаюсь написать собственный класс проверки, который проверяет, что письмо еще не используется. Для этого у меня есть метод, который учитывает пользовательские профили, у которых есть указанный адрес электронной почты. Достаточно просто, но если пользователь обновляет свой профиль, мне нужно исключить их профиль из числа, о котором я упоминал. Таким образом, чтобы сделать это, я написал следующий метод:MVC3 Атрибут проверки Custon с использованием двух свойств

public static bool IsEmailUnique(string email, int userprofileId) 
{ 
    int count = -1; 

    using (var db = new TRDataContext()) 
    { 
     count = (from u in db.Userprofiles 
       where u.email == email && 
         (userprofileId == 0 || u.userprofile_id != userprofileId) 
       select u).Count(); 
    } 

    return count == 0; 
} 

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

public class EmailValidatorAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     if (value == null) 
      return false; 

     return Userprofile.IsEmailUnique(value.ToString(), 0); 
    } 
} 

и реализован как этот

[DisplayName("Email Address")] 
[Required(ErrorMessage = "Required")] 
[RegularExpression(EmailRegex, ErrorMessage = "Invalid email address")] 
[EmailValidator(ErrorMessage = "Already in use")] 
public string email { get; set; } 

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

Любая помощь была бы принята с благодарностью.

Спасибо!

ответ

2

У меня была аналогичная проблема. Во-первых, я реализовал метод «CurrentUser» в моем хранилище пользователя, который выглядит немного что-то вроде этого:

 //Gets the current user 
     public U_USER CurrentUser() 
     { 
      return GetUser(HttpContext.Current.User.Identity.Name); 
     } 

     public U_USER GetUser(string u) 
     { 
      return (from us in db.U_USER 
        where us.UserName == u 
        select us).FirstOrDefault(); 
     } 

Вы можете использовать это, чтобы получить идентификатор из внутри атрибута проверки в порядке, аналогично описанному ниже:

public class EmailValidatorAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     using(UserRepository ur = new UserRepository()) 
     { 
      if (value == null) 
       return false; 

      var user = ur.CurrentUser(); 
      return Userprofile.IsEmailUnique(value.ToString(), user.userprofile_id); 
     } 
    } 
} 
2

Вы могли бы извлечь это из HttpContext:

string currentUsername = HttpContext.Current.User.Identity.Name; 

и до Я приговорена за предложение использования HttpContext.Current в методе, вы могли бы использовать поставщик:

public class EmailValidatorAttribute : ValidationAttribute 
{ 
    public Func<HttpContextBase> ContextProvider =() => new HttpContextWrapper(HttpContext.Current); 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
      return false; 

     string currentUsername = ContextProvider().User.Identity.Name; 

     ... 
    } 
} 

, который теперь может легко высмеиваться в единичном тесте.

 Смежные вопросы

  • Нет связанных вопросов^_^