自定义DataAnnotations ValueAttribute在客户端和服务器端验证时提供不同的错误消息

本文关键字:消息 错误 验证 ValueAttribute DataAnnotations 客户端 服务器端 自定义 | 更新日期: 2023-09-27 18:06:03

我创建了一个自定义数据注释,它在客户端按预期工作,当输入的日期无效时正确地向用户显示自定义消息。但是,如果条目服务器端验证失败,则返回默认错误消息。我无法了解为什么在服务器端验证失败时也不显示自定义消息的根源。在调试器中,一切似乎都很好,但输出最终是不正确的。任何帮助将非常感激!

public class DobViewModel
{
   [DateTypeWithPhrase()]
   public DateTime? DateOfBirth { get; set; }    
}
public class DataTypeWithPhraseAttributeAdapter : DataAnnotationsModelValidator<DateTypeWithPhraseAttribute>
{
   private readonly DateTypeWithPhraseAttribute _attribute;
   public DataTypeWithPhraseAttributeAdapter(ModelMetadata metadata, ControllerContext context, DateTypeWithPhraseAttribute attribute)
          : base(metadata, context, attribute)
   {
        _attribute = attribute;
   }
    public static void SelfRegister()
    {
         DataAnnotationsModelValidatorProvider
              .RegisterAdapter(
                  typeof(DateTypeWithPhraseAttribute),
                  typeof(DataTypeWithPhraseAttributeAdapter));
    }
    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return new[] { new ModelClientValidationDateRule(_attribute.ErrorMessage) };
    }
}
public class DateTypeWithPhraseAttribute : DataTypeAttribute
{
    public DateTypeWithPhraseAttribute() : base(DataType.Date)
    {
         ErrorMessageResourceName = null;
         ErrorMessage = ErrorPhrase;
    }
    public string ErrorPhrase = "Invalid Date";
 }

自定义DataAnnotations ValueAttribute在客户端和服务器端验证时提供不同的错误消息

似乎是在绑定回发时触发了错误。如果日期无效,它将识别出存在错误,并将DateOfBirth的值设置为null,这将通过自定义验证。但是,它已经失败了,因此返回默认消息。

我实现的解决方案是将DateOfBirth更改为字符串,这样就可以正确绑定。然后重写IsValid方法来验证字符串是否实际上是一个有效的日期。

public class DobViewModel
{
   [DateTypeWithPhrase()]
   public string DateOfBirth { get; set; }    
}
public class DateTypeWithPhraseAttribute : DataTypeAttribute
{
    public DateTypeWithPhraseAttribute() : base(DataType.Date)
    {
         ErrorMessageResourceName = null;
         ErrorMessage = ErrorPhrase;
    }
    public string ErrorPhrase = "Invalid Date";
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        DateTime myDate;
        if (value == null || DateTime.TryParse(value.ToString(), out myDate))
        {
            return ValidationResult.Success;
        }
        return new ValidationResult(ErrorMessage);
    }
 }

我的一个同事发现了一篇文章的链接,该文章提出了创建自定义模型绑定器的可能性,我将在将来的日期研究它。