13

Tôi có hai trường riêng biệt trên trang: một cho ngày và một cho thời gian.Xác thực chỉ nhập thời gian trong xác thực không chính thức của MV.net asp.net

Đây là mô hình:

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

Đây là quan điểm:

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

Các javascript xác nhận không phô trương hoạt động tốt với các lĩnh vực Date tuy nhiên khi tôi nhập "11:00" hoặc " 11:00 chiều "trong StartTime xác thực hiển thị

" Trường StartTime phải là một dat e "

Xác thực phía máy chủ hoạt động tốt với "0:hh:mm tt" chỉ là javascript có sự cố. Hiện tại tôi chỉ vô hiệu hóa xác thực javascript nhưng cuối cùng cũng muốn có nó trên trang này

Điều này có thể được thực hiện cho trường "thời gian" không?

Trả lời

14

Trung thực là cách dễ nhất để đạt được điều này là sử dụng trình xác thực biểu thức chính quy cho nó. Đây là một ví dụ.

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

Việc xác nhận không phô trương nên chỉ làm việc tốt với các biểu hiện này.

Hy vọng điều này có thể giúp bạn!

EDIT

tôi đã khắc phục các biểu thức chính quy mà bắt đầu ném những sai sót trong giao diện điều khiển vì một số nhân vật bất hợp pháp. Ngoài ra, bạn sẽ cần một trình bao bọc thuộc tính chuỗi cho thuộc tính này, nếu không nó sẽ luôn tìm kiếm DateTime hợp lệ.

Dưới đây là những gì bạn nên ràng buộc.

mẫu:

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

Xem:

@Html.TextBoxFor(m => m.StartTimeValue) 
+0

không cháy ở phía khách hàng. Tôi cần làm gì để RegEx xác thực trong javascript trước? – Vitalik

+0

Sau khi xem lại mã của bạn một lần nữa, tôi nhận ra rằng bạn đang thay đổi ID thành "timeStart". Nếu bạn loại bỏ điều này, việc xác nhận sẽ kích hoạt chính xác. – technicallyjosh

+0

Tôi phải làm điều gì sai. thời điểm tôi thêm thuộc tính RegularExpression nó chuyển sang xác nhận phía máy chủ chỉ – Vitalik

0

Trong mô hình quan điểm của bạn cố gắng này

[Display(Name = "Start Time")] 
    [Time] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")] 
    public DateTime Time { get; set; } 

và có lớp thuộc tính

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: Tôi cũng nhận thức được rằng trong một số trường hợp, bạn cần phải thêm một số kịch bản để html khách hàng như được tìm thấy trong câu trả lời này MVC3 unobtrusive validation group of inputs mặc dù tôi không chắc chắn chính xác khi nào cần thiết. Câu trả lời này sẽ giúp bạn có một nửa ở đó. Thật không may, tôi không chắc chắn câu trả lời này ngăn cản việc postback, nhưng nó đánh dấu mô hình là không hợp lệ.

+0

Chỉ cần cố gắng này. Không có sự khác biệt. Thực tế nó không bao giờ nhấn phương thức IsValid(). – Vitalik

8

Add DataType.Time thuộc tính đến lĩnh vực thời gian của bạn và sử dụng EditorFor s để loại bỏ định dạng trùng lặp:

Mẫu

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

Xem

@Html.EditorFor(m => m.Date, new { type = "text" }) 
    @Html.EditorFor(m => m.StartTime, new { type = "text", id = "timeStart" }) 
+0

@ Html.EditorFor hiển thị hộp văn bản có các điều khiển thời gian (giờ, phút, giây) trong Chrome. nó không phải là những gì tôi muốn, tôi muốn một hộp văn bản bởi vì tôi sử dụng một điều khiển javascript bên thứ ba trên đầu trang của hộp văn bản của tôi cho khả năng tương thích trình duyệt chéo. Nếu tôi sử dụng TextBoxFor thì thuộc tính "DataType" không có tác dụng. Trong thực tế tôi có thể nhập "aaa" và nó vẫn đi qua xác nhận – Vitalik