web-dev-qa-db-ja.com

asp.netMVCでの時間のみの入力の検証控えめな検証

このページには、日付用と時間用の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の検証を無効にしましたが、最終的にはこのページに表示したいと思います

これは「時間」フィールドに対して実行できますか?

16
Vitalik

正直なところ、これを実現する最も簡単な方法は、正規表現バリデーターを使用することです。これが例です。

[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)
16
technicallyjosh

追加 DataType.Time属性を時間フィールドに設定し、EditorForsを使用して形式の重複を削除します。

モデル

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

ビューモデルでこれを試してください

    [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控えめな入力の検証グループ いつ正確にわからないのですが必要。この答えはあなたをそこまで半分に導くはずです。残念ながら、この回答がポストバックを防ぐかどうかはわかりませんが、モデルに無効​​のフラグを立てます。

0
user1778606