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

     ... 
    } 
} 

现在可能在单元测试中很容易被嘲笑。