【问题标题】:Custom Error Message while implementing IValidatableObject实现 IValidatableObject 时的自定义错误消息
【发布时间】:2019-05-13 17:38:40
【问题描述】:

我已经实现了IValidatableObject,没有任何问题:

 public class DisclaimerCBs : IValidatableObject
 {
        public bool cb1 { get; set; } = false;
        public bool cb2 { get; set; } = false;
        public bool cb3 { get; set; } = false;

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            Type type = validationContext.ObjectInstance.GetType();
            IEnumerable<PropertyInfo> checkBoxeProperties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.PropertyType == typeof(bool));

            bool allIsChecked = true;
            foreach (PropertyInfo checkBoxProperty in checkBoxeProperties)
            {
                var isChecked = (bool)checkBoxProperty.GetValue(validationContext.ObjectInstance);
                if (!isChecked)
                {
                    allIsChecked = false;
                    break;
                }
            }

            if(!allIsChecked)
                yield return new ValidationResult("Please agree to all Disclaimers. ");

            //TRUE IF THIS FAR
            yield return ValidationResult.Success;
        }
}

但是,这只会在验证摘要中显示错误消息。我还想让这个错误将焦点带到指定的 &lt;div&gt; 元素并在标签中重申错误,就像属性验证器使用 &lt;span asp-validation-for="Model.Property"&gt;&lt;/span&gt; 一样。我怎么能做到这一点?

【问题讨论】:

    标签: razor asp.net-core unobtrusive-validation


    【解决方案1】:

    将您的 Validate 方法替换为以下内容:

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
         Type type = validationContext.ObjectInstance.GetType();
         IEnumerable<PropertyInfo> checkBoxeProperties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.PropertyType == typeof(bool));
    
         List<ValidationResult> validationResult = new List<ValidationResult>();
    
         foreach (PropertyInfo checkBoxProperty in checkBoxeProperties)
         {
             var isChecked = (bool)checkBoxProperty.GetValue(validationContext.ObjectInstance);
             if (!isChecked)
             {
                 validationResult.Add(new ValidationResult("Please agree to this Disclaimer.", new[] { checkBoxProperty.Name }));
             }
         }
    
         return validationResult;
    }
    

    【讨论】:

    • 我如何使用 TagHelper 调用您的示例? &lt;span asp-validation-for=""&gt;&lt;/span&gt; 谢谢@TanvirArjel
    • 我已经更新了答案。如果您的标签助手的名称与 DisclaimerCBs 模型类的属性名称相同,它将自动引用标签助手。请检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2013-05-29
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多