2012-02-20 70 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; 
} 

這非常適用於新用戶的自定義驗證類,因爲所有我需要做的是在爲userprofile_id傳遞一個0。

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

然後,您可以用此方法類似於下面的方式您的驗證屬性中獲得ID:

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; 

     ... 
    } 
} 

現在可能在單元測試中很容易被嘲笑。