私は、パスワードの変更機能で異なる長さの値を、ユーザーのロールに基づいて作成された新しいパスワードに適用する必要があります。ユーザーに管理役割がない場合、最小長は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にプロパティ値を挿入して、正しい最小長を判断できるようにするにはどうすればよいですか?
ありがとうございます!
属性値に静的定数しか使用できないため、達成したいとは思えません。 – DevilSuichiro
私は変数の値で属性を装飾することはできませんが、検証コンテキスト項目のコレクションや他のメソッドに値を注入する方法があります。そのため、IsValidの内部では、問題のユーザーが管理役割を持っているかどうかを評価できます? – djcohen66
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 –