2013-07-10 39 views
16

Tôi có một trang MVC có chứa một vài timepickers. Chúng được lưu trữ trong một danh sách các đối tượng trong mô hình như là nullable TimeSpan. Vấn đề là tôi nhận được khoảng thời gian in bằng giây vào các trường nhập liệu. Có cách nào để định dạng các đặc tính mô hình này để tôi nhận được các lần in theo cách khác (như 7:00, thay vì 07:00:00)? Không cần phải nói, "đề xuất" của tôi về [DisplayFormat...] không hoạt động. Ít nhất không phải là cách tôi hy vọng.Định dạng mô hình MVC Trường TimeSpan

Các lĩnh vực đầu vào được định nghĩa như thế này:

@Html.TextBoxFor(x => x.Shifts[i].Start) 

Phần liên quan của mô hình trông giống như:

public class Workshift 
{ 
    [DisplayFormat(Something here perhaps?)] 
    public TimeSpan? Start { get; set; } 
    public TimeSpan? End { get; set; } 
    public TimeSpan? Pause { get; set; } 
} 

public class TimeRegistrationViewModel 
{ 
    public List<Workshift> Shifts { get; set; } 

    ... 
} 

Đánh giá cao nó như mọi khi!

+0

Kể từ khi không ai dường như biết làm thế nào để thực hiện điều này, tôi đã đi với sử dụng chuỗi thay vì TimeSpans. Vẫn sẽ được mát mẻ để biết làm thế nào để làm điều đó đúng. – SamiHuutoniemi

Trả lời

25
[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)] 
public TimeSpan? Start { get; set; } 

[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)] 
public TimeSpan? End { get; set; } 

[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)] 
public TimeSpan? Pause { get; set; } 

Nhưng xin lưu ý rằng mục đích chính cho TimeSpan là đại diện cho khoảng thời gian được đo, không phải là thời gian trong ngày. Điều này có nghĩa là giá trị TimeSpan có thể dài hơn 24 giờ. Chúng cũng có thể âm, đại diện cho việc di chuyển ngược về dòng thời gian.

Đó là được chấp nhận để sử dụng chúng làm thời gian trong ngày và thực tế được thực hiện bởi chính khuôn khổ đó (ví dụ: DateTime.TimeOfDay). Nhưng khi sử dụng theo cách này, bạn nên xác thực đầu vào của người dùng một cách cẩn thận. Nếu bạn chỉ dựa vào loại dữ liệu, người dùng có thể nhập các giá trị là khoảng thời gian hợp lệ, nhưng không phải là ngày hợp lệ. Ví dụ: -1.22:33:44TimeSpan hợp lệ đại diện cho 1 ngày, 22 giờ, 33 phút và 44 giây trong quá khứ.

Sẽ dễ dàng hơn nhiều nếu .Net có kiểu gốc Time, nhưng không. Cập nhật: Hiện có loại TimeOfDay gốc trong gói System.Time có sẵn trong CoreFXLab.

Ngoài ra, phương pháp TextBoxFor sẽ không nhận chú thích dữ liệu. Bạn có thể trực tiếp xác định chuỗi định dạng như một tham số, như thế này:

@Html.TextBoxFor(x => x.Shifts[i].Start, "{0:hh\\:mm}") 

Hoặc bạn có thể chuyển sang EditorFor như thế này:

@Html.EditorFor(x => x.Shifts[i].Start) 
+0

Câu trả lời này cực kỳ hữu ích cho tôi. Cảm ơn bạn rất nhiều! –

+0

Nó rất hữu ích khi đề cập đến: "Ngoài ra, phương pháp TextBoxFor sẽ không nhận chú thích dữ liệu." Bạn có bất kỳ tham chiếu nào về dòng này không? – nguyenhoai890

Các vấn đề liên quan