1

パスワードの比較検証があります-パスワードフィールドを確認し、サーバー検証を行って、パスワードが最小文字数に適合するかどうかを確認します。

意見:

@Html.PasswordFor(model => model.password)
@Html.PasswordFor(model => model.repeatPassword)

モデル:

    public class Model_Clerk
    {            
        public int clerkID { get; set; }    

        public string password { get; set; }

        [Compare("password", ErrorMessage = "Error comparing password and password confirm values")]                        
        public string repeatPassword { get; set; }

    }

コントローラーのアクション方法:

    public ActionResult SaveClerk(Model_Clerk model)
    {            
        //Password minimum lenght
        if (!string.IsNullOrEmpty(model.password) && model.password.Trim().Length < 5)
        {
            ModelState.AddModelError(model.password, "Password must be at least 5 characters long");                 
        }

        if (ModelState.IsValid)
        {
            //Save logic here...
        }
        else
        {
            return PartialView("EditClerks", model);
        }
    }

サーバー検証が実行されると、警告メッセージが正しく表示され、その後、比較検証は機能しなくなります。何か案が?

4

2 に答える 2

1

私たちのコメントから、実際に最善の解決策は、独自のDataAnnotationを作成することだと思います。

何かのようなもの[CompareIf("password", ErrorMessage = "Error comparing password and password confirm values")]

DataAnnotationコードは、パスワードが空で有効でないかどうかを確認してから、2つの値を比較する必要があります。

于 2012-09-27T10:31:25.930 に答える
0

今日この問題に遭遇し、CompareIfカスタム属性を作成しました。RequiredIf これは(ここで説明)とほぼ同じですが、代わりに継承し、3番目の引数としてCompareAttributeを受け入れます。otherProperty

using System.ComponentModel.DataAnnotations;

public class CompareIfAttribute : CompareAttribute
{
    private readonly string _dependentProperty;
    private readonly object _targetValue;

    public CompareIfAttribute(string dependentProperty, object targetValue, string otherProperty) : base(otherProperty)
    {
        _dependentProperty = dependentProperty;
        _targetValue = targetValue;
    }

    /// <summary>
    ///     Returns if the given validation result is valid. It checks if the RequiredIfAttribute needs to be validated
    /// </summary>
    /// <param name="value">Value of the control</param>
    /// <param name="validationContext">Validation context</param>
    /// <returns></returns>
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var field = validationContext.ObjectType.GetProperty(_dependentProperty);

        if (field != null)
        {
            var dependentValue = field.GetValue(validationContext.ObjectInstance, null);

            if (dependentValue == null && _targetValue == null || dependentValue?.ToString() == _targetValue?.ToString())
            {
                var test = base.IsValid(value, validationContext);
                
                if (test != ValidationResult.Success)
                {
                    return test;
                }
            }

            return ValidationResult.Success;
        }

        throw new ValidationException($"CompareIf Dependant Property {_dependentProperty} does not exist");
    }
}

最初の2つの引数は依存プロパティとターゲット値であり、3番目は比較するプロパティです。使用法:

    public bool CandidateHasNoLegalMiddleName { get; set; }

    public string CandidateMiddle { get; set; }

    [CompareIf(nameof(CandidateHasNoLegalMiddleName), false, nameof(CandidateMiddle)]
    public string ConfirmMiddle { get; set; }

これにより、条件が真の場合にのみ比較を行うことができます。

于 2021-06-22T15:55:55.480 に答える