63

私のユーザーモデルには、入力フィールドを検証するための次のデータ注釈があります。

[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

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

4

4 に答える 4

135

を使用している場合は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);
    }
}
于 2012-11-05T17:28:26.350 に答える
8

比較アノテーションを使用して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; }
于 2018-06-29T18:57:41.113 に答える
0

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

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

[Required]
[DataType(DataType.Password)]
[Compare("Password")]
public string ConfirmPassword { get; set; }
于 2018-03-19T06:12:47.233 に答える
0

BlazorEditForm検証用

上記の回答は、メッセージが表示されていなかったため、うまくいきませんでした。


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

        public PropertyMustMatchAttribute(string originalProperty)
            : base(_defaultErrorMessage)
        {
            OriginalProperty = originalProperty;
        }
        
        public string OriginalProperty { get; }

        protected override ValidationResult IsValid(object value,
            ValidationContext validationContext)
        {
            var properties = TypeDescriptor.GetProperties(validationContext.ObjectInstance);
            var originalProperty = properties.Find(OriginalProperty, false);
            var originalValue = originalProperty.GetValue(validationContext.ObjectInstance);
            var confirmProperty = properties.Find(validationContext.MemberName, false);
            var confirmValue = confirmProperty.GetValue(validationContext.ObjectInstance);
            if (originalValue == null)
            {
                if (confirmValue == null)
                {
                    return ValidationResult.Success;
                }

                return new ValidationResult(ErrorMessage,
                    new[] { validationContext.MemberName });
            }

            if (originalValue.Equals(confirmValue))
            {
                return ValidationResult.Success;
            }

            return new ValidationResult(ErrorMessage,
                new[] { validationContext.MemberName });
        }
    }
于 2021-10-16T21:34:04.190 に答える