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 に答える