13

私はページに2つのフィールドを持っています.1つは日付用、もう1つは時間用です。asp.netの時間限定入力の検証MVCの邪魔にならない検証

これはモデルです:

[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" }) 

i "は11:00 PM" または "を入力すると、javascriptの控えめな検証がしかしDateフィールドで正常に動作します11:00 pm "StartTimeで有効性確認が表示されます

"フィールドStartTimeはdat e "

サーバー側の検証は、"0:hh:mm tt"で問題なく動作します。問題はjavascriptのみです。今のところ私はJavaScriptのバリデーションを無効にしましたが、最終的にはこのページに載せたいと思っています

これは「時間」フィールドで行うことができますか?あなたのビューモデルで

答えて

14

これは、正規表現のバリデータを使用することですそれのための。ここに例があります。

[RegularExpression(@"^(0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$", ErrorMessage = "Invalid Time.")] 

控えめな検証は、この式でうまく動作するはずです。

希望があなたを助けることができます!

EDITは

ため、私はいくつかの不正な文字のコンソールにエラーを投げ始めた正規表現を修正しました。また、このプロパティの文字列プロパティラッパーが必要です。そうでない場合は、常に有効な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) 
+0

はクライアント側で発生しません。 RegExがJavascriptで最初に検証する必要がありますか? – Vitalik

+0

あなたのコードをもう一度見直した後、IDを「timeStart」に変更していることに気付きました。これを削除すると、検証が正しく実行されます。 – technicallyjosh

+0

私は間違ったことをする必要があります。私はRegularExpression属性を追加する瞬間にサーバー側の検証に切り替える – Vitalik

0

この

[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; 
    } 
} 

EDITを持っている:私はまた、いくつかのケースでは、クライアントのHTMLに、いくつかのスクリプトを追加する必要があることを承知していますこの回答で見つかったようなMVC3 unobtrusive validation group of inputs私は正確にはいつ必要があるかは分かりませんが。この回答はあなたのところの半分を得るはずです。残念ながら、私はこの回答がポストバックを防ぐのかどうかはわかりませんが、モデルに無効​​なフラグを立てます。

+0

はこれを試してみました。違いはありません。実際、IsValid()メソッドを決して打つことはありません。 – Vitalik

8

あなたの時間フィールドにDataType.Time属性を追加し、フォーマットの重複を削除するEditorFor秒を使用します。達成するために正直なところ、最も簡単な方法を

モデル

[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" }) 
+0

@ Html.EditorForは、Chromeの時間コントロール(時間、分、秒)を含むテキストボックスをレンダリングします。それは私が欲しいものではない、私はクロスブラウザの互換性のために私のテキストボックスの上にサードパーティのJavaScriptコントロールを使用するので、私はテキストボックスが欲しい。私がTextBoxForを使用する場合、 "データ型"属性は役に立ちません。実際に私は "aaa"を入力することができ、それでも有効性は確認されます – Vitalik

関連する問題