2013-06-04 25 views
9

Tôi đang cố định dạng một số DateTimes trong MVC nhưng DisplayFormat không được áp dụng cho đối tượng Nullable và tôi không thể hiểu tại sao. Nó hoạt động hoàn toàn tốt đẹp trên CreatedDateTime nhưng không LastModifiedDateTimeDisplayFormat không hoạt động với Nullable <DateTime>

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yy hh:mm tt}")] 
public DateTime CreatedDateTime { get; set; } 
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yy hh:mm tt}")] 
public Nullable<DateTime> LastModifiedDateTime { get; set; } 

Dưới đây là Xem

<div class="editor-field"> 
     @Html.DisplayFor(model => model.CreatedDateTime) 
     <br /> 
     @Html.Raw(TimeAgo.getStringTime(Model.CreatedDateTime)) 
    </div> 
    @if (Model.LastModifiedDateTime.HasValue) 
    { 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.LastModifiedDateTime) 
     </div> 
     <div class="editor-field"> 
      @Html.DisplayFor(model => model.LastModifiedDateTime) 
     <br /> 
      @Html.Raw(TimeAgo.getStringTime(Model.LastModifiedDateTime.Value)) By: @Html.DisplayFor(model => model.LastModifiedBy) 
     </div> 
    } 
+0

Không thành công nếu bạn sử dụng 'DateTime?' Thay vì 'Nullable '? – TyCobb

+0

Thay đổi nó thành DateTime? không có hiệu lực. – Preston

+1

@TyCobb 'DateTime?' Và 'Nullable ' giống hệt nhau. –

Trả lời

6

Nếu tôi hiểu ý định của bạn đúng (Tôi hy vọng tôi đã làm), sau đó bạn có thể có một mẫu hiển thị cho Nullable bởi đặt mẫu của bạn vào Views/Shared/DisplayTemplates/DateTime.cshtml và xác định mẫu như sau:

Tôi hy vọng điều này sẽ hữu ích.

EDIT

Bạn có thể có nhiều hiển thị mẫu cho cùng loại và xác định cái nào để sử dụng theo tên vì vậy hãy nói rằng bạn có:

  • Views/Shared/DisplayTemplates/Name1.cshtml
  • Views/Shared/DisplayTemplates/Name2.cshtml

Sau đó, bạn có thể gọi cho họ như:

@Html.DisplayFor(model => model.LastModifiedDateTime, "Name1") 
@Html.DisplayFor(model => model.LastModifiedDateTime, "Name2") 
+0

Điều này giải quyết được vấn đề nhưng nếu tôi muốn DateTimes hiển thị khác nhau ở những nơi khác nhau thì sao? – Preston

+1

@Preston kiểm tra chỉnh sửa của tôi. –

+0

Đây là cách giải quyết tốt nhất hiện nay, cảm ơn. Nhưng thực sự một số loại mở rộng là cần thiết để làm điều này một cách tổng quát cho toàn bộ ứng dụng và hỗ trợ các thuộc tính chú thích dữ liệu hiện có. Nhưng tôi sẽ kiểm tra MVC 5 đầu tiên để xem nếu Microsoft đã thực hiện điều đó vào cốt lõi. Tôi sử dụng các loại nullable rất nhiều, đó là một yêu cầu cốt lõi từ kinh nghiệm của tôi. –

1

Tôi nghĩ rằng cách đơn giản nhất để định dạng nullable DateTime là sử dụng ValueFor phương pháp:

@Html.ValueFor(m => m.CreatedDateTime , "{0:MM/dd/yy hh:mm tt}") 
@Html.ValueFor(m => m.LastModifiedDateTime , "{0:MM/dd/yy hh:mm tt}") 

Khi sử dụng ValueFor phương pháp với TimeSpan hoặc Nullable<TimeSpan>, nhân vật dấu hai chấm ":" phải được thoát:

@Html.ValueFor(m => m.MyTimeSpan, "{0:hh':'mm}") 
Các vấn đề liên quan