2013-06-04 12 views
9

Sto provando a formattare alcuni DateTimes in MVC ma DisplayFormat non viene applicato all'oggetto Nullable e non riesco a capire perché. Ha funzionato perfettamente bene su CreatedDateTime ma non LastModifiedDateTimeDisplayFormat non funziona con 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; } 

Di seguito la vista

<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

Non funziona correttamente se si utilizza "DateTime?" Invece di "Nullable "? – TyCobb

+0

Cambiarlo in DateTime? non ha alcun effetto – Preston

+1

@TyCobb 'DateTime?' E 'Nullable ' sono identici. –

risposta

6

Se ho capito le vostre intenzioni corretta (spero che ho fatto), allora si può avere un modello di visualizzazione per Nullable da ponendo il modello nella Views/Shared/DisplayTemplates/DateTime.cshtml e definirlo come il seguente:

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

Spero che questo aiuta.

EDIT

Si possono avere più modelli di visualizzazione per lo stesso tipo e specificare quale usare per nome Quindi diciamo che avete:

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

Puoi quindi chiamarli come:

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

Questo risolve il problema, ma cosa succede se voglio che DateTimes si visualizzi in modo diverso in posti diversi? – Preston

+1

@Preston controlla la mia modifica. –

+0

Questa è la migliore "soluzione" per ora, grazie. Ma in realtà è necessario un certo tipo di estensione per fare ciò genericamente per l'intera applicazione e supportare gli attributi di annotazione dati esistenti. Ma vado a controllare prima MVC 5 per vedere se Microsoft lo ha già implementato nel core. Uso molto i tipi nullable, è un requisito fondamentale della mia esperienza. –

1

penso modo più semplice per formattare annullabile DateTime è quello di utilizzare ValueFor metodo:

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

Quando si utilizza ValueFor metodo con TimeSpan o Nullable<TimeSpan>, carattere due punti ":" deve essere sfuggito:

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