このページには、日付用と時間用の2つの別々のフィールドがあります。
これはモデルです:
[Required]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
public DateTime? StartTime { get; set; }
[Required]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime Date { get; set; }
これはビューです:
@Html.TextBoxFor(m => m.Date, "{0:MM/dd/yyyy}", new { type = "text" })
@Html.TextBoxFor(m => m.StartTime, "{0:hh:mm tt}", new { type = "text", id = "timeStart" })
Javascriptの控えめな検証はDate
フィールドで正常に機能しますが、StartTime
に「11:00 PM」または「11:00 pm」と入力すると検証が表示されます
「フィールドStartTimeは日付でなければなりません」
サーバー側の検証は"0:hh:mm tt"
で正常に機能しますが、問題があるのはjavascriptだけです。今のところ、JavaScriptの検証を無効にしましたが、最終的にはこのページに表示したいと思います
これは「時間」フィールドに対して実行できますか?
正直なところ、これを実現する最も簡単な方法は、正規表現バリデーターを使用することです。これが例です。
[RegularExpression(@"^(0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$", ErrorMessage = "Invalid Time.")]
控えめな検証は、この式で問題なく機能するはずです。
これがお役に立てば幸いです。
[〜#〜]編集[〜#〜]
一部の不正な文字が原因でコンソールでエラーをスローし始めた正規表現を修正しました。また、このプロパティには文字列プロパティラッパーが必要です。そうでない場合は、常に有効なDateTime
が検索されます。
以下はあなたが拘束すべきものです。
モデル:
public DateTime? StartTime { get; set; }
[Required]
[RegularExpression(@"^(0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$", ErrorMessage = "Invalid Time.")]
public string StartTimeValue
{
get
{
return StartTime.HasValue ? StartTime.Value.ToString("hh:mm tt") : string.Empty;
}
set
{
StartTime = DateTime.Parse(value);
}
}
表示:
@Html.TextBoxFor(m => m.StartTimeValue)
追加 DataType.Time
属性を時間フィールドに設定し、EditorFor
sを使用して形式の重複を削除します。
モデル
[Required]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
[DataType(DataType.Time)]
public DateTime? StartTime { get; set; }
[Required]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime Date { get; set; }
表示
@Html.EditorFor(m => m.Date, new { type = "text" })
@Html.EditorFor(m => m.StartTime, new { type = "text", id = "timeStart" })
ビューモデルでこれを試してください
[Display(Name = "Start Time")]
[Time]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
public DateTime Time { get; set; }
属性クラスがあります
public class TimeAttribute : ValidationAttribute, IClientValidatable
{
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = ErrorMessage,
ValidationType = "time"
};
}
public override bool IsValid(object value)
{
DateTime time;
if (value == null || !DateTime.TryParse(value.ToString(), out time))
return false;
return true;
}
}
編集:場合によっては、この回答にあるようなスクリプトをクライアントhtmlに追加する必要があることも認識しています MVC3控えめな入力の検証グループ いつ正確にわからないのですが必要。この答えはあなたをそこまで半分に導くはずです。残念ながら、この回答がポストバックを防ぐかどうかはわかりませんが、モデルに無効のフラグを立てます。