2013-06-04 43 views
9

我試圖格式化MVC一些DateTime是否但是DisplayFormat沒有被應用到可空對象,我想不通爲什麼。它的工作完全正常的CreatedDateTime但不LastModifiedDateTimeDisplayFormat不是可空<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; } 

下面是查看

<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

如果您使用'DateTime?'而不是'Nullable ',它會失敗嗎? – TyCobb

+0

將它更改爲DateTime?沒有效果。 – Preston

+1

@TyCobb'DateTime?'和'Nullable '是相同的。 –

回答

6

如果我理解你的意圖,正確的是(我希望我所做的那樣),那麼你可以通過有可能爲空的顯示模板把你的模板Views/Shared/DisplayTemplates/DateTime.cshtml並將其定義如下所示:

@model System.DateTime? 
@Html.Label("", Model.HasValue ? Model.Value.ToString("MM/dd/yy hh:mm tt") : string.Empty) 

我希望這有助於。

編輯

你可以有多個顯示模板爲同一類型,並指定由名稱要使用哪一個讓我們說你有:

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

然後你可以打電話給他們:

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

這解決了這個問題,但如果我想讓DateTime在不同的地方以不同的方式顯示呢? – Preston

+1

@Preston檢查我的編輯。 –

+0

這是目前最好的「解決方法」,謝謝。但是真正需要某種擴展來爲整個應用程序進行這種擴展,並支持現有的數據註釋屬性。但是我將首先檢查MVC 5,看看微軟是否已經將其實施到核心中。我大量使用可空類型,這是我的經驗的一個核心要求。 –

1

我認爲最簡單的方式來格式化可空DateTime是使用ValueFor方法:

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

當使用ValueForTimeSpanNullable<TimeSpan>,冒號 「:」 來轉義:

@Html.ValueFor(m => m.MyTimeSpan, "{0:hh':'mm}")