13

我有兩個單獨的字段在頁面上:一個日期和一個時間。驗證在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" }) 

的JavaScript當我輸入 「11:00 PM」 或「不引人注目的驗證工作正常與Date但是場11:00 PM「在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.")] 

不顯眼的驗證應該只是這種表達罰款。

希望這能幫助你!

編輯

,我已經修復它開始扔在控制檯,因爲一些非法字符的錯誤的正則表達式。另外,您將需要此屬性的字符串屬性包裝器,否則它將始終查找有效的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; 
    } 
} 

編輯:我也知道,在某些情況下,你需要一些腳本添加到客戶端的HTML例如在這個答案中找到MVC3 unobtrusive validation group of inputs,雖然我並不完全確定它的必要性。這個答案應該讓你在那裏一半。不幸的是,我不確定這個答案是否會阻止回發,但它確實將該模型標記爲無效。

+0

只是嘗試這樣做。沒有區別。事實上,它從未打中過IsValid()方法。 – Vitalik

8

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

@ Html.EditorFor在Chrome中呈現帶時間控件(小時,分鐘,秒)的文本框。這不是我想要的,我想要一個文本框,因爲我在我的文本框頂部使用第三方javascript控件來實現跨瀏覽器兼容性。如果我使用TextBoxFor,那麼「DataType」屬性不起作用。事實上,我可以輸入「aaa」,它仍然通過驗證 – Vitalik

相關問題