2012-02-20 11 views
1

電子メールがまだ使用されていないことを検証するカスタム検証クラスを作成しようとしています。これを行うには、問題の電子メールアドレスを持つuserprofilesを数えるメソッドがあります。十分に単純ですが、ユーザーがプロフィールを更新している場合は、私が言及した数からプロフィールを除外する必要があります。だから、それを行うために、私は次のような方法が書かれている:私がする必要があるすべてはuserprofile_idのために0を渡しているようMVC3 2つのプロパティを使用した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; 
} 

これは、新規ユーザー用のカスタムバリデータクラスに適しています。

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を渡す必要があります。私はこのことを考え出すのが難しいです。

ご協力いただければ幸いです。

ありがとうございます!

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

をし、私はこの方法でHttpContext.Currentの使用を提案するため宣告しています前に、あなたは、プロバイダ使用できます:

答えて

2

私も同様の問題がありました。あなたはその後、下記のと同様に、あなたの検証属性の内部からIDを取得するためにこれを使用することができます

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

まず私はこのような小さなものになります私のユーザー・リポジトリで「CurrentUserに」メソッドを実装しました
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からこれを取り出すことができ

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; 

     ... 
    } 
} 

今可能性を単体テストで簡単に嘲笑される。

関連する問題