【问题标题】:Custom DataAnnotations ValueAttribute suppling different error message on client-side and server-side validation自定义 DataAnnotations ValueAttribute 在客户端和服务器端验证提供不同的错误消息
【发布时间】:2013-03-27 15:57: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";
 }

【问题讨论】:

    标签: c# asp.net-mvc validation data-annotations


    【解决方案1】:

    似乎在回发绑定时触发了错误。如果日期无效,它会识别出错误,并将 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);
        }
     }
    

    我的一位同事后来找到了一篇文章的链接,该文章提出了创建自定义模型活页夹的可能性,我将在未来进行研究。文章是here,最初发现是here。

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2012-01-21
      • 2010-10-16
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      相关资源
      最近更新 更多