0
public class Dinner
    {
        public string ID { get; set; }
        public string Title { get; set; }
        public Category Category { get; set; }
        public DateTime? DateCreated { get; set; }
    }

そのクラスのモデルビュー(重要な部分)は

public class DinnerModelView
    {
        ...
        [UIHint("DatePicker")]
        [DateTime(ErrorMessage = "Invalida date")]
        public DateTime? DateCreated { get; set; }
    }

DateTimeAttriburte の場所

public class DateTimeAttribute : ValidationAttribute
    {
        public DateTimeAttribute () : base (() => "Invalid date") { }
        public DateTimeAttribute(string errorMessage) : base(() => errorMessage) { } 
        public override bool IsValid(object value)
        {
            if (value == null)
                return true;

            bool isValid = false;
            if (value is DateTime)
                isValid = true;

            DateTime tmp;
            if (value is String)
            {
                if(String.IsNullOrEmpty((string)value))
                    isValid = true;
                else
                    isValid = DateTime.TryParse((string)value, out tmp);
            }

            return isValid;
        }
    }

ただし、モデル状態エラーには、「値 'xxxx' は DateCreated に対して有効ではありません」と表示されます。このメッセージを置き換えることはできません。なぜ?

4

2 に答える 2

0

DateCreated プロパティは DateTime 型であるため、MVC は DateTimeAttribute をチェックする前にそれを何らかの方法で検証し、カスタム エラー メッセージに到達しないようです。

代わりに DateCreated を文字列に変更すると、おそらく機能します。ただし、値をデータベースに保存する必要があるため、DateCreated 型を変更する必要はありません。代わりに、DateCreatedStr という新しいプロパティを作成し、代わりにユーザーがこのプロパティにデータを入力できるようにします。データを保存する直前に、(検証済みの) データを DateCreatedStr から DateCreated に移動できます。

良い方法ではないことはわかっていますが、うまくいきます!

于 2011-10-20T21:18:03.653 に答える
0

protected ValidationAttribute(string errorMessage)の代わりに 使用しprotected ValidationAttribute(System.Func errorMessageAccessor)ます。後者は、リソース ファイルで定義された文字列にアクセスするためのものです。http://msdn.microsoft.com/en-us/library/cc679238.aspxをチェックしてください

于 2009-11-26T10:41:45.147 に答える