@ Html.DisplayFor - DateFormat ("mm / dd / yyyy")


90

Ho il seguente codice razor che voglio avere nel mm/dd/yyyyformato della data:

Audit Date: @Html.DisplayFor(Model => Model.AuditDate)

Ho provato diversi approcci ma nessuno di questi approcci funziona nella mia situazione

my AuditDate è un DateTime?tipo

Ho provato qualcosa di simile e ho ricevuto questo errore:

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

Informazioni aggiuntive: i modelli possono essere utilizzati solo con accesso ai campi, accesso alle proprietà, indice di matrice a dimensione singola o espressioni dell'indicizzatore personalizzato a parametro singolo.

Ho provato questo:

@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))

Nessun sovraccarico per il metodo "ToString" accetta 1 argomento

Risposte:


164

Se si utilizza DisplayFor, è necessario definire il formato tramite l' DisplayFormatattributo o utilizzare un modello di visualizzazione personalizzato. (Un elenco completo dei preset DisplayFormatStringpuò essere trovato qui .)

[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime? AuditDate { get; set; }

Oppure crea la vista Views\Shared\DisplayTemplates\DateTime.cshtml:

@model DateTime?
@if (Model.HasValue)
{
    @Model.Value.ToString("MM/dd/yyyy")
}

Ciò si applicherà a tutti DateTimei messaggi, anche a quelli in cui stai codificando l'ora. Se vuoi che si applichi solo alle proprietà di sola data, utilizza Views\Shared\DisplayTemplates\Date.cshtmle l' DataTypeattributo sulla tua proprietà:

[DataType(DataType.Date)]
public DateTime? AuditDate { get; set; }

L'ultima opzione è quella di non utilizzare DisplayFore invece di rendere la proprietà direttamente:

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}

Ho creato un displayTemplate come hai suggerito e quando copio e incollo il codice che hai nel modello, ricevo questo erroreNo overload for method 'ToString' takes 1 arguments
Nick Kahn

4
Penso che dovrebbe essere[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]

[DisplayFormat (DataFormatString = "{0: dd / MM / yyyy}")] ha funzionato per la Turchia grazie
zapoo

@ Mac: come intendi? Sono molto fanno il lavoro, ma forse non solo nel vostro scenario specifico. Senza ulteriori informazioni, non posso dire quali siano le tue situazioni.
Chris Pratt

Se si desidera che l'editor per utilizzare il formato di aswell, aggiungere ApplyFormatInEditMode = truealla proprietà: [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]. Dovrebbe essere ovvio, ma quando non hai tempo da sprecare copia-incolla, quel suggerimento dell'intellisense potrebbe passare oltre il tuo naso come ha fatto il mio :)
Heki

19

Se stai semplicemente restituendo il valore di quella proprietà del modello, non hai bisogno DisplayFordell'helper html, basta chiamarlo direttamente con la corretta formattazione della stringa .

Audit Date: @Model.AuditDate.Value.ToString("d")

Dovrebbe produrre

Audit Date: 1/21/2015

Infine, la data di controllo potrebbe essere nulla, quindi è necessario eseguire il controllo condizionale prima di provare a formattare un valore nullable.

@if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")}

Cercare su Google l'errore che stai ricevendo fornisce questa risposta , che mostra che l'errore è dovuto all'utilizzo della parola Modello nei tuoi helper Html. Ad esempio, utilizzando @Html.DisplayFor(Model=>Model.someProperty). Modificali per usare qualcos'altro oltre Model, ad esempio: @Html.DisplayFor(x=>x.someProperty)o cambia la Mmaiuscola min minuscolo in questi helper.


1
se ho usato @Model.AuditDate.Value.ToString("d") Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Nick Kahn

@AbuHamzah - sembra che tu stia ancora cercando di inserire questo nell'helper Html.DisplayFor. Non farlo. Inoltre, sei sicuro che stia generando l'errore su quella riga e non su qualche altra proprietà su cui stai cercando di utilizzare l' DisplayForhelper?
Tommy

Se ho usato @Model...ricevo questo errore: 'Model' è in conflitto con la dichiarazione System.Web.Mvc.WebViewPage <TModel> .Model '
Nick Kahn

@AbuHamzah Si prega di vedere l'ultimo paragrafo nella mia risposta aggiornata.
Tommy

11

Ho utilizzato questa modifica nel mio codice:

vecchio codice:

 <td>
  @Html.DisplayFor(modelItem => item.dataakt)
 </td>

nuovo:

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>

... e? È una risposta o cosa?
Maciej Jureczko

Sì, è semplicemente la soluzione al problema dal soggetto. Ho pensato che questo potrebbe essere utile a qualcuno.
Piotr Mirek

OK, ti suggerirei di cambiare "Ho usato questa modifica nel mio codice" con qualcosa che dichiari specificamente che questa è una soluzione.
Maciej Jureczko

Risposta semplice e conveniente, ha funzionato per me grazie !!
Scanner

Problemi se dataakt è di tipo DateTime?
Emanuele


5

Ho implementato la cosa simile in questo modo:

  1. Utilizzare TextBoxFor per visualizzare la data nel formato richiesto e rendere il campo di sola lettura .
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

2. Assegnare zero struttura e zero bordo a TextBox in css.

.my-style {
    outline: none;
    border: none;
}

E ... è fatto :)


1
Ma perché lo faresti così?
CodeCaster

Perché nessuno degli altri metodi non ha funzionato per me e mi ha fatto risparmiare un sacco di codice. Inoltre, il risultato finale è di sola lettura e non ha bordi, quindi non sembrava una casella di testo.
Akshat

5

È possibile utilizzare l' attributo [ DisplayFormat ] sul modello di visualizzazione poiché si desidera applicare questo formato all'intero progetto.

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }

4

Per me è stato sufficiente usare

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }

2

Dopo un po 'di ricerca, ho finito per impostare Threadil valore CurrentCulture di avere CultureInfo ("en-US") nel metodo di azione del controller:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

Ecco alcune altre opzioni se vuoi avere questa impostazione in ogni vista.

Informazioni sul CurrentCulturevalore della proprietà:

L' oggetto CultureInfo restituito da questa proprietà, insieme agli oggetti associati, determinano il formato predefinito per date, ore, numeri, valori di valuta, ordinamento del testo, convenzioni di maiuscole e minuscole e confronti di stringhe.

Fonte: MSDN CurrentCulture

Nota: l' CurrentCultureimpostazione della proprietà precedente è probabilmente facoltativa se il controller è già in esecuzione con CultureInfo("en-US")o è simile al formato della data"MM/dd/yyyy" .

Dopo aver impostato la CurrentCultureproprietà, aggiungi il blocco di codice per convertire la data in "M/d/yyyy"formato nella vista:

@{  //code block 
    var shortDateLocalFormat = "";
    if (Model.AuditDate.HasValue) {
       shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
       //alternative way below
       //shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d");
    }
}

@shortDateLocalFormat

Sopra la @shortDateLocalFormatvariabile è formattata con ToString("M/d/yyyy")opere. Se ToString("MM/dd/yyyy")viene utilizzato, come ho fatto prima, si finisce per avere zero problemi . Anche come consigliato da Tommy ToString("d") funziona pure. In realtà "d"sta per "modello di data breve" e può essere utilizzato anche con diversi formati di lingua / cultura.

Immagino che il blocco di codice dall'alto possa anche essere sostituito con un metodo di supporto interessante o simile.

Per esempio

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {     
        shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
     }

    @shortDateLocalFormat
}

può essere utilizzato con questa chiamata di supporto

@DateFormatter(Model.AuditDate)

Aggiornamento , ho scoperto che esiste un modo alternativo per fare la stessa cosa quando viene utilizzato il metodo DateTime.ToString (String, IFormatProvider) . Quando viene utilizzato questo metodo, non è necessario utilizzare Threadla CurrentCultureproprietà di. Il CultureInfo("en-US")viene passato come secondo argomento -> IFormatProvider al DateTime.ToString(String, IFormatProvider)metodo.

Metodo di supporto modificato:

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {
       shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
    }

    @shortDateLocalFormat
}

.NET Fiddle


1

Forse prova semplicemente

@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)

inoltre puoi usare molti tipi di formato stringa come .ToString ("dd MMM, yyyy") .ToString ("d") ecc


ottenendo l'errore: 'Model' è in conflitto con la dichiarazione 'System.Web.Mvc.WebViewPage <TModel> .Model'
Nick Kahn

se l'ho usato @modelnon riconosce
Nick Kahn

@AbuHamzah - Mi sono sbagliato, è una maiuscola Mquando si utilizza nella pagina HTML, minuscolo mquando si dichiara.
Tommy

ricevo ancora l'errore, leggi Rispondo alla risposta di Tommy
Nick Kahn

1
No overload for method 'ToString' takes 1 argumentslamentarsi quando usoToString("mm/dd/yyyy")
Nick Kahn

1

In Visualizza Sostituisci questo:

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

Con:

@if(@Model.AuditDate.Value != null){@Model.AuditDate.Value.ToString("dd/MM/yyyy")}
else {@Html.DisplayFor(Model => Model.AuditDate)}

Spiegazione: Se il valore AuditDate non è nullo, formatterà la data in gg / MM / aaaa, altrimenti lasciarla così com'è perché non ha alcun valore.


0

Ho avuto un problema simile sul mio controller ed ecco cosa ha funzionato per me:

model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""

"DateSigned" è il valore del mio modello La riga legge, se il valore del modello ha un valore, formatta il valore, altrimenti non mostra nulla.

Spero possa aiutare


0

Questo è il modo migliore per ottenere una semplice stringa di data:

 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()

Ecco cosa fa questa risposta: prende l' HtmlStringoutput da DisplayFor, lo converte in a String, lo analizza come a DateTime, quindi lo formatta come a String. Inutilmente complesso, secondo me.
Scimmia eretica

0

Potresti usare Convert

 <td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td> 

-1

Vedi questa risposta suNo overload for method 'ToString' takes 1 arguments errore.

Non è possibile formattare un DateTime nullable: è necessario utilizzare la proprietà DateTime.Value.

@Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty

Suggerimento: è sempre utile elaborare queste cose in una classe standard con intellisense prima di metterle in vista. In questo caso, si otterrebbe un errore di compilazione che sarebbe facile individuare in una classe.


se utilizzo il codice suggerito, ottengo questo errore'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'
Nick Kahn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.