1

カスタム検証を使用してユーザー名を比較しています。古い値と同じかどうか、または正規表現に合格するかどうかを確認していますが、そうでない場合はエラーをスローします。可能であれば、ビューモデルから UserID を取得するにはどうすればよいですか?

    [EmailValidation]
    public string Username{ get; set; }
    public int UserID { get; set; }



public class EmailValidationAttribute : ValidationAttribute
    {
         protected override ValidationResult IsValid(object value, ValidationContext validationContext)
         {

             User user= User.getUserByID(UserID); //How to get UserID?
             string username= value.ToString();
             if (user.Username== username || IsValid(username))
                {
                    return ValidationResult.Success;
                }
                else
                {
                    return new ValidationResult("Error");
                }

            }
4

3 に答える 3

5

ValidationContextのからUserIDを取得できObjectInstanceます。あなたの場合、それはあなたのUserクラスのインスタンスになります。

public class EmailValidationAttribute : ValidationAttribute
{
     protected override ValidationResult IsValid(object value, ValidationContext validationContext)
     {
         UserDto dto = (UserDto)validationContext.ObjectInstance;
         User user= User.getUserByID(dto.UserID);
         string username = value.ToString();
         if (user.Username == username || IsValid(username))
         {
            return ValidationResult.Success;
         }
         else
         {
            return new ValidationResult("Error");
         }

    }
}

より普遍的なものが必要な場合は、プロパティ名を指定するプロパティを追加し、リフレクションを使用して値を取得できます。

于 2013-02-11T18:59:21.853 に答える
3

最も簡単な方法は、フィールド バリデータではなく、バリデーションをクラスに移動することです。

参考: http: //jeffhandley.com/archive/2009/10/16/validator.aspx

class MyClass : IValidatableObject {
    public string EmailAddress { get; set; }
    public int UserID { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
      User user= User.getUserByID(UserID); // UserID is available because this is a method on the object
      string username= value.ToString();
      if (user.Username== username || IsValid(username)) {
          // it's fine?
      } else {
          yield return new ValidationResult("Error");
      }
    }
}
于 2013-02-11T19:02:30.030 に答える
1

ここでは 2 段階のプロセスをお勧めします。これにより、将来、この属性を新しいクラスで使用できるようになります。

1) UserID を含む抽象クラスを作成し、この EmailValidationAttribute を持つすべてのクラスでそのクラスを拡張します。

2) 検証ではvalue、抽象クラス タイプにキャストし、そこから UserID を取得できます。

于 2013-02-11T18:56:27.780 に答える