Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义DataAnnotations ValueAttribute在客户端和服务器端验证中提供不同的错误消息_C#_Asp.net Mvc_Validation_Data Annotations - Fatal编程技术网

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

C# 自定义DataAnnotations ValueAttribute在客户端和服务器端验证中提供不同的错误消息,c#,asp.net-mvc,validation,data-annotations,C#,Asp.net Mvc,Validation,Data Annotations,我已经创建了一个自定义数据注释,它在客户端按预期工作,在输入的日期无效时正确地向用户显示自定义消息。但是,如果条目未通过服务器端验证,则返回默认错误消息。我无法找到服务器端验证失败时自定义消息不显示的根本原因。逐步执行,调试器中的一切看起来都很好,但输出最终是不正确的。任何帮助都将不胜感激 public class DobViewModel { [DateTypeWithPhrase()] public DateTime? DateOfBirth { get; set; }

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

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";
 }
公共类模型
{
[日期类型与短语()]
公共日期时间?出生日期{get;set;}
}
公共类DataTypeWithPhraseAttributeAdapter:DataAnnotationsModelValidator
{
private readonly DateTypeWithPhraseAttribute\u属性;
公共数据类型WithPhraseAttributeAdapter(ModelMetadata元数据、ControllerContext上下文、DateTypeWithPhraseAttribute属性)
:base(元数据、上下文、属性)
{
_属性=属性;
}
公共静态无效自寄存器()
{
DataAnnotationsModelValidatorProvider
.RegisterAdapter(
typeof(DateTypeWithPhraseAttribute),
typeof(datatypewithphraseattributedapter));
}
公共重写IEnumerable GetClientValidationRules()
{
返回new[]{new ModelClientValidationDateRule(_attribute.ErrorMessage)};
}
}
公共类DateTypeWithPhraseAttribute:DataTypeAttribute
{
public DateTypeWithPhraseAttribute():base(DataType.Date)
{
ErrorMessageResourceName=null;
ErrorMessage=ErrorPhrase;
}
公共字符串ErrorPhrase=“无效日期”;
}

在回发绑定时似乎触发了错误。如果日期无效,它将识别出有错误,并将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);
    }
 }
后来,我的一位同事找到了一篇文章的链接,该文章提出了创建自定义模型活页夹的可能性,我将在将来的某个日期对此进行研究。这篇文章是最初发现的