2

私は、パスワードの変更機能で異なる長さの値を、ユーザーのロールに基づいて作成された新しいパスワードに適用する必要があります。ユーザーに管理役割がない場合、最小長は12です。管理役割を持つ場合、最小長は16です。バリデーションデータをValidationAttributeに渡す

現在のコードには、このような可変要件ロジックはありません。新しいパスワードプロパティの実装はそれほどモデルクラスで呼ばChangePasswordDataようなものだった:

///summary> 
    /// Gets and sets the new Password. 
    /// </summary> 
    [Display(Order = 3, Name = "NewPasswordLabel", ResourceType = typeof(UserResources))] 
    [Required] 
    [PasswordSpecialChar] 
    [PasswordMinLower] 
    [PasswordMinUpper] 
    [PasswordMaxLength] 
    [PasswordMinLength] 
    [PasswordMinNumber] 
    public string NewPassword { get; set; } 

検証属性がそうのように設定されている:

/// <summary> 
/// Validates Password meets minimum length. 
/// </summary> 
public class PasswordMinLength : ValidationAttribute 
{ 
    public int MinLength { get; set; } 

    public bool IsAdmin { get; set; } 

    public PasswordMinLength() 
    { 
     // Set this here so we override the default from the Framework 
     this.ErrorMessage = ValidationErrorResources.ValidationErrorBadPasswordLength; 

     //Set the default Min Length 
     this.MinLength = 12; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value == null || !(value is string) || !UserRules.PasswordMinLengthRule(value.ToString(), this.MinLength)) 
     { 
      return new ValidationResult(this.ErrorMessageString, new string[] { validationContext.MemberName }); 
     } 

     return ValidationResult.Success; 
    } 
} 

は私がMINLENGTHの値を設定できるようにしたいです12または16 IsAdminの値に基づいてしかし、私は属性[PasswordMinLength(IsAdmin = myvarable)]を飾る方法を見つけることができません。定数のみが許されます。 ValidationAttributeにプロパティ値を挿入して、正しい最小長を判断できるようにするにはどうすればよいですか?

ありがとうございます!

+0

属性値に静的定数しか使用できないため、達成したいとは思えません。 – DevilSuichiro

+0

私は変数の値で属性を装飾することはできませんが、検証コンテキスト項目のコレクションや他のメソッドに値を注入する方法があります。そのため、IsValidの内部では、問題のユーザーが管理役割を持っているかどうかを評価できます? – djcohen66

+1

1つのオプションは、[クラスレベル検証](http://weblogs.asp.net/scottgu/class-level-model-validation-with-ef-code-first-and-asp-net-mvc-3)を使用することです。 )をビューモデルに追加します。それ以外の場合は、[PasswordMinLength( "IsAdmin")]のようなアノテーションを作成してから、次のような手法を使用してそのプロパティにアクセスできます。http://odetocode.com/blogs/scott/archive/2011/ 02/21/custom-data-annotation-valid-part-i-server-code.aspx –

答えて

0

例(http://odetocode.com/blogs/scott/archive/2011/02/21/custom-data-annotation-validator-part-i-server-code.aspx)にこのリンクを提供してくれたSteve Greeneのおかげで、私は私の検証の質問に答えました。ここで更新されたコードは次のとおりです。

/// <summary> 
/// Validates Password meets minimum length. 
/// </summary> 
public class PasswordMinLength : ValidationAttribute 
{ 
    public int MinLength { get; set; } 

    public PasswordMinLength(string IsAdminName) 
    { 
     // Set this here so we override the default from the Framework 
     this.ErrorMessage = ValidationErrorResources.ValidationErrorBadPasswordLength; 
     IsAdminPropertyName = IsAdminName; 
     //Set the default Min Length 
     this.MinLength = 12; 
    } 

    public string IsAdminPropertyName{ get; set; } 

    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(ErrorMessageString, name, IsAdminPropertyName); 
    } 

    protected bool? GetIsAdmin(ValidationContext validationContext) 
    { 
     var retVal = false; 
     var propertyInfo = validationContext 
           .ObjectType 
           .GetProperty(IsAdminPropertyName); 
     if (propertyInfo != null) 
     { 
      var adminValue = propertyInfo.GetValue(
       validationContext.ObjectInstance, null); 

      return adminValue as bool?; 
     } 
     return retVal; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (GetIsAdmin(validationContext) != null) 
     { 
      if (GetIsAdmin(validationContext) == true) 
       this.MinLength = 16; 
      else 
       this.MinLength = 12; 
     } 
     else 
      this.MinLength = 12; 

     if (value == null || !(value is string) || !UserRules.PasswordMinLengthRule(value.ToString(), this.MinLength)) 
     { 
      return new ValidationResult(this.ErrorMessageString, new string[] { validationContext.MemberName }); 
     } 

     return ValidationResult.Success; 
    } 

} 

私は単に私のモデルクラスにIsAdminプロパティを追加しましたので、同様PASSWORDMINLENGTH属性飾ら:魔法のように

[Display(Order = 3, Name = "NewPasswordLabel", ResourceType = typeof(UserResources))] 
[Required] 
[PasswordSpecialChar] 
[PasswordMinLower] 
[PasswordMinUpper] 
[PasswordMaxLength] 
[PasswordMinLength("IsAdmin")] 
[PasswordMinNumber] 
public string NewPassword { get; set; } 

public bool IsAdmin { get; set; } 

作品。スティーブありがとう!

関連する問題