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

时间:2013-03-27 15:57:03

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

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

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";
 }

1 个答案:

答案 0 :(得分:0)

看起来在回发时绑定时会触发错误。如果日期无效,则会识别出存在错误,并将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