7

Ho un modello con alcune proprietà di data e ora.Il parametro DataFormatString dell'attributo DisplayFormat non funziona se utilizzato con @ Html.TextBoxFor()

Le proprietà di tempo hanno il seguente DataAnnotation:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")] 

E le proprietà di data hanno:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")] 

Tuttavia, questi sono rispettati solo quando uso @Html.EditorFor() e non @Html.TextBoxFor().

La mia situazione attuale non mi consente di utilizzare lo EditorFor, quindi come posso forzare il TextBoxFor a rispettare queste stringhe di formato?

+0

perché devi usare 'TextBoxFor'? – DarthVader

+0

La validazione non funziona correttamente con 'EditorFor's. Abbiamo investigato senza che nulla sia ancora arrivato. La convalida – Kehlan

+0

potrebbe essere correlata al tuo 'CultureInfo' che stai utilizzando nella tua app. – DarthVader

risposta

14

Si può provare la seguente:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}") 

C'è anche un sovraccarico che prende gli attributi HTML, in modo da poter impostare la classe CSS, cavo fino datepickers, ecc:

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" }) 
+0

Perché '@ class =" input-large "'? – Kehlan

+0

solo dicendo che puoi applicare i tuoi stili. come il selettore di date jquery – DarthVader

+0

Gotcha. Penso che finirò con questa soluzione. – Kehlan

0

Forse una proroga il metodo può essere creato:

public static MvcHtmlString DateTimeFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
    { 
     var compilationResult = expression.Compile(); 
     TValue dateValue = compilationResult((TModel)html.ViewDataContainer.ViewData.Model); 
     var body = (MemberExpression)expression.Body; 
     return html.TextBox(body.Member.Name, (Convert.ToDateTime(dateValue)).ToCustomDateFormat(), new { id = body.Member.Name, datepicker = true }); 
    } 

il metodo ToCustomDateFormat potrebbe essere un metodo di estensione per dat Tipi eTime che restituiscono il valore stringa nel formato desiderato.

utilizzati:

@Html.DateTimeFor(x=>x.AnyDateTimeProperty) 

In questo modo, la formattazione di tutto variabile datetime può essere controllato da una singola funzione. Ha funzionato bene per me (per le proprietà DateTime e DateTime?), anche se non sono sicuro che la compilazione dell'espressione in fase di esecuzione sia una buona idea.

0

Un'opzione che ho fatto per questo:

@Html.TextBoxFor(m => m.Patient.DOB, new { @Value = string.Format("{0:MM/dd/yyyy}", Model.EndDate) }) 
0

In MVC5 è possibile chiamare il formato di visualizzazione definita nella vista evitando di duplicare il formato di datetime, proprio codice è il seguente modo:

@Html.TextBoxFor(m => m.TotalAmount, Model.DOB.GetDateTimeFormats()[0]) 
Problemi correlati