4

そのため、MVC で .NET メンバーシップ システムを使用する場合、パスワード ポリシーは web.config ファイルで定義されます。たとえば、minPasswordLength は members->profiles で定義されます。

ビューを使用する場合、これは@Membershipコンポーネントを使用してアクセスできます

Passwords must be at least @Membership.MinRequiredPasswordLength characters long.

ただし、サンプル MVC アプリケーションのデフォルト モデルを見ると、次のように表示されます。

 [Required]
 [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
 [DataType(DataType.Password)]
 [Display(Name = "New Password")]
 public string NewPassword { get; set; }

私が興味を持っているのはMinimumLength = 6、これはハードコードされているため、パスワードの長さを更新したい場合は、web.config を編集するだけでなく (Microsoft が提案するように)、への参照を検索する必要があることです。ソースでそれを変更し、あらゆる場所で変更します (おそらく、最良のプログラミング方法ではありません)。

属性で変数を使用する方法はありますか。これはおそらく実行時ではなくコンパイル時に発生するため、そうではないと思います。将来的にすべての参照を置き換える必要をなくすためのより良いパターンを知っている人がいない場合は?

4

2 に答える 2

8

そんな疑問にお答えできる記事をご紹介します。基本的に、web.config から最小の長さを取得する独自の DataAnnotation を作成します。

後世のために、参照されたサイトで使用されているコードは次のとおりです。

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter , AllowMultiple = false, Inherited = true)]
public sealed class MinRequiredPasswordLengthAttribute : ValidationAttribute, IClientValidatable
{                        
    private readonly int _minimumLength = Membership.MinRequiredPasswordLength;        
    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, _minimumLength);
    } 
    public override bool IsValid(object value)
    {           
        string password = value.ToString();
        return password.Length >= this._minimumLength;            
    }        
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new[]{
            new ModelClientValidationStringLengthRule(FormatErrorMessage(metadata.GetDisplayName()), _minimumLength, int.MaxValue)
        };
    } 
}

そしてあなたのViewModelで

[Required]        
[MinRequiredPasswordLength(ErrorMessage = "The {0} must be at least {1} character(s) long.")]           
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
于 2012-06-25T17:12:47.340 に答える
1

検証属性に変数パラメーターが必要な場合は、独自の属性を開発して適用する必要があります。

おそらく「MinLengthFromConfigFile」と呼んでいますか?

于 2012-06-25T17:12:41.327 に答える