45


6

日付に `[Range]`アノテーションを使うことは可能ですか?

何かのようなもの

[Range(typeof(DateTime), DateTime.MinValue.ToString(), DateTime.Today.ToString())]

6 Answer


53


私はあなたの問題を解決するためにこれをしました

パブリッククラスDateAttribute:RangeAttribute {パブリックDateAttribute():base(typeof(DateTime)、DateTime.Now.AddYears(-20).ToShortDateString()、DateTime.Now.AddYears(2).ToShortDateString()){}}


46


http://msdn.microsoft.com/ja-jp/library/system.componentmodel.dataannotations.rangeattribute.aspx[MSDNのドキュメント]にはRangeAttributeを使用できると記載されています
[範囲(typeof(DateTime)、 "1/2/2004"、 "3/4/2004"、ErrorMessage = "{0}の値は{1}と{2}の間でなければなりません")]公開日時何か{get ;セット;}


9


jQuery検証は動作しません

  • 私のMSDNドキュメントは正しくありません


5


日付を文字列として書き込まなければならないとき(属性を使用しているとき)には、 ISO-8601の表記を使用することを強くお勧めします。 それは2004年1月2日が1月2日なのか2月1日なのかについての混乱を排除します。

[Range(typeof(DateTime)、 "2004-12-01"、 "2004-12-31"、ErrorMessage = "{0}の値は{1}と{2}の間でなければなりません")]公開日時何か{get ;セット;}


4


これは別の解決策です。

[Required(ErrorMessage = "Date Of Birth is Required")]
[DataType(DataType.Date, ErrorMessage ="Invalid Date Format")]
[Remote("IsValidDateOfBirth", "Validation", HttpMethod = "POST", ErrorMessage = "Please provide a valid date of birth.")]
[Display(Name ="Date of Birth")]
公開日時DOB {get;セット; }

単にValidationControllerと呼ばれる新しいMVCコントローラを作成し、そこにこのコードを貼り付けます。 「リモート」アプローチのいいところは、このフレームワークを利用して、カスタムロジックに基づくあらゆる種類の検証を処理できることです。

システムを使用する。 System.Collections.Genericを使用します。 System.Diagnosticsを使用します。 System.Linqを使用します。 System.Net.Mailを使用します。 System.Webを使用する。 System.Web.Mvcを使用します。

名前空間YOURNAMESPACEHERE {パブリッククラスValidationController:Controller {[HttpPost] public JsonResult var max = DateTime.Now.AddYears(-110); var msg = string.Format( "{0:MM / dd / yyyy}から{1:MM / dd / yyyy}までの値を入力してください"、max、min); {var date = DateTime.Parse(dob);}を試してください。 if(date> min || date <max)はJson(msg)を返します。そうでなければJson(true)を返します。 catch(例外){return Json(msg);} }}}}


0


私はこのアプローチを使います:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
内部の密閉されたクラスDateRangeAttribute:ValidationAttribute {public DateTime Minimum {get; public DateTime最大値{get;} }

public DateRangeAttribute(最小文字列= null、最大文字列= null、文字列フォーマット= null){format = format ?? @ "yyyy-MM-dd'T'HH:mm:ss.FFFK"; // iso8601

最小=最小== null? DateTime.MinValue:DateTime.ParseExact(最小、新規[] {フォーマット}、CultureInfo.InvariantCulture、DateTimeStyles.None); // 0 invariantculture最大=最大== null? DateTime.MaxValue:DateTime.ParseExact(最大、新しい[] {フォーマット}、CultureInfo.InvariantCulture、DateTimeStyles.None); // 0 invariantculture

if(Minimum> Maximum)は、新しいInvalidOperationExceptionをスローします($ "指定された最大日付 '{最大}'は、指定された最小日付 '{最小}'"より小さい)。 // 0単なるrangevalidatorの代わりにこのカスタムバリデータを使用する唯一の理由は、range属性のように// currentcultureを使用する代わりに、invariantcultureを解析に適用したかったことです。実稼働環境で厄介なしゃっくりをかわす

パブリックオーバーライドbool IsValid(オブジェクト値){if(value == null)// 0 nullはtrueを返します。

var s =文字列としての値。 if(s!= null

var min =(IComparable)最小値。 var max =(IComparable)最大値。 min.CompareTo(value)<= 0を返します

パブリックオーバーライド文字列FormatErrorMessage(文字列名)=> string.Format(CultureInfo.CurrentCulture、ErrorMessageString、名前、最小値、最大値); }

そしてそれをこんな風に使う

[DateRange("2004-12-01", "2004-12-2", "yyyy-M-d")]
ErrorMessage = "{0}の値は{1}と{2}の間でなければなりません")]