web-dev-qa-db-ja.com

確認パスワードを検証するためのデータ注釈

My Userモデルには、入力フィールドを検証するためのこれらのデータアノテーションがあります。

[Required(ErrorMessage = "Username is required")]
[StringLength(16, ErrorMessage = "Must be between 3 and 16 characters", MinimumLength = 3)]
public string Username { get; set; }

[Required(ErrorMessage = "Email is required"]
[StringLength(16, ErrorMessage = "Must be between 5 and 50 characters", MinimumLength = 5)]
[RegularExpression("^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$", ErrorMessage = "Must be a valid email")]
public string Email { get; set; }

[Required(ErrorMessage = "Password is required"]
[StringLength(255, ErrorMessage = "Must be between 5 and 255 characters", MinimumLength = 5)]
public string Password { get; set; }

[Required(ErrorMessage = "Confirm Password is required"]
[StringLength(255, ErrorMessage = "Must be between 5 and 255 characters", MinimumLength = 5)]
public string ConfirmPassword { get; set; }

ただし、パスワードの確認がパスワードと同じであることを確認する方法を見つけるのに問題があります。私が知る限り、これらの検証ルーチンのみが存在します:Required, StringLength, Range, RegularExpression

ここで何ができますか?ありがとう。

48
James Dawson

ASP.Net MVC 3を使用している場合、System.Web.Mvc.CompareAttributeを使用できます。

ASP.Net 4.5を使用している場合、System.Component.DataAnnotationsにあります。

[Required(ErrorMessage = "Password is required")]
[StringLength(255, ErrorMessage = "Must be between 5 and 255 characters", MinimumLength = 5)]
[DataType(DataType.Password)]
public string Password { get; set; }

[Required(ErrorMessage = "Confirm Password is required")]
[StringLength(255, ErrorMessage = "Must be between 5 and 255 characters", MinimumLength = 5)]
[DataType(DataType.Password)]
[Compare("Password")]
public string ConfirmPassword { get; set; }

編集:MVC2以下のロジックを使用、代わりにPropertiesMustMatch属性を使用Compare属性[以下のコードはデフォルトのMVCApplicationプロジェクトテンプレートからコピーされます。]

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public sealed class PropertiesMustMatchAttribute : ValidationAttribute
{
    private const string _defaultErrorMessage = "'{0}' and '{1}' do not match.";
    private readonly object _typeId = new object();

    public PropertiesMustMatchAttribute(string originalProperty, string confirmProperty)
        : base(_defaultErrorMessage)
    {
        OriginalProperty = originalProperty;
        ConfirmProperty = confirmProperty;
    }

    public string ConfirmProperty { get; private set; }
    public string OriginalProperty { get; private set; }

    public override object TypeId
    {
        get
        {
            return _typeId;
        }
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
            OriginalProperty, ConfirmProperty);
    }

    public override bool IsValid(object value)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
        object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value);
        object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value);
        return Object.Equals(originalValue, confirmValue);
    }
}
103

比較アノテーションを使用して2つの値を比較できます。また、ダウンストリームのどこにも保持されないことを確認する必要がある場合(たとえば、EFを使用している場合)、NotMappedを追加してエンティティ-> DBマッピングを無視することもできます

利用可能なデータ注釈の完全なリストについては、こちらをご覧ください。

https://msdn.Microsoft.com/en-us/library/system.componentmodel.dataannotations(v = vs.110).aspx

[Required]
[DataType(DataType.Password)]
public string Password { get; set; }

[Required]
[DataType(DataType.Password)]
[Compare("Password")]
[NotMapped]
public string ConfirmPassword { get; set; }
1
Mahadi Hasan

他のデータ注釈はオプションであり、要件に応じて追加できますが、パスワード比較操作を実装するにはこれを行う必要があります

[Required]
[DataType(DataType.Password)]
public string Password { get; set; }

[Required]
[DataType(DataType.Password)]`enter code here`
[Compare("Password")]
public string ConfirmPassword { get; set; }
0
Khursand Kousar