0

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

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

1 回答 1

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

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

于 2013-04-03T13:07:34.037 回答