5

DataAnnotations を使用しているモデルがあります。何かのようなもの

public class Appointment {
    [Required(ErrorMessage="Please enter your name")]
    public string Name { get; set; }

    [Required(ErrorMessage="Please enter your appointment date?")] 
    [DataType(DataType.Date, ErrorMessage="Appointment date is not a date")]
    public DateTime AppointmentDate { get; set; }
}

「必須」属性は、ErrorMessage の値を尊重します。つまり、値を入力しないと、「入力してください」というメッセージが表示されます。ただし、DateTime フィールドに文字列を入力すると、標準のシステム エラー メッセージ「The value 'blah' is not valid for AppointmentDate」が表示されます。

ASP.NET MVC コードを使用してデバッグしましたが、FormatException の場合、propertyMetadata から正しい表示名が選択されていないようです。それか、あからさまに明らかな何かが欠けています:/

誰かがこの問題に遭遇しましたか? それは私ですか、それとも単なるベータ版ですか (私は ASP.NET MVC 2 Beta を使用しています)?

4

2 に答える 2

2

MVC1 では、DataType 属性は期待どおりに機能しません。MVC2 でも機能しないようです。最善の方法は、日付を表す文字列プロパティを用意し、その有効性を確認することです。

プロジェクトからの抜粋を次に示します (DataAnnotations と xVal を使用)。

private List<ErrorInfo> _errors;
        private List<ErrorInfo> Errors
        {
            get
            {
                if (_errors == null)
                    _errors = new List<ErrorInfo>();
                return _errors;
            }
            //set { _errors = value; }
        }

private string _startDateTimeString;

        /// <summary>
        /// A string reprsentation of the StartDateTime, used for validation purposes in the views.
        /// </summary>
        /// <remarks>
        /// If the user passes something like 45/45/80 it would be a valid mm/dd/yy format, but an invalid date,
        /// which would cause an InvalidOperationException to be thrown by UpdateModel(). By assigning dates to string properties
        /// we can check not only the format, but the actual validity of dates.
        /// </remarks>
        public string StartDateTimeString
        {
            get
            {
                return _startDateTimeString;
            }
            set
            {
                // Check whether the start date passed from the controller is a valid date.
                DateTime startDateTime;
                bool validStartDate = DateTime.TryParse(value, out startDateTime);
                if (validStartDate)
                {
                    StartDateTime = startDateTime;
                }
                else
                {
                    Errors.Add(new ErrorInfo("StartDateTime", "Provide a valid date for the start time."));
                }

                _startDateTimeString = value;
            }
        }

        partial void OnValidate(ChangeAction action)
        {
            if (action != ChangeAction.Delete)
            {
                Errors.AddRange(DataAnnotationsValidationRunner.GetErrors(this));

                if (StartDateTimeString != null)
                {
                    DateTime startDateTime;
                    if (!DateTime.TryParse(StartDateTimeString, out startDateTime))
                    {
                        Errors.Add(new ErrorInfo("StartDateTime", "Provide a valid date for the start time."));
                    }
                }

                if (Errors.Any())
                    throw new RulesException(Errors);
            }
        }
    }

プロジェクトの両方の場所にチェックを入れるのは理にかなっていますが、概念を示したいだけです。

于 2009-11-24T22:02:31.677 に答える
1

今日この問題に遭遇したので、別の回避策を共有したいと思いました...

[Required(ErrorMessage="Please enter your appointment date?")] 
//[DataType(DataType.Date, ErrorMessage="Appointment date is not a date")]
[Range(typeof(DateTime), "1/1/1880", "1/1/2200", ErrorMessage = "...")]
public string AppointmentDate { get; set; }

日時の代わりに文字列を操作するようにコードを調整する必要があります (これがビュー モデルの一部である場合はおそらく簡単です) が、エラー メッセージは期待どおりに機能し、文字列は有効な日付であることが保証されます (おそらく時間)。

于 2010-10-08T18:37:51.663 に答える