2012-08-31 6 views
8

Nei tempi passati prima di asp.net 4.5 potevamo facilmente associare una data a un controllo Gridview, Formview o altri dati e renderlo presentabile con un formato semplice stringa.Utilizzare il nuovo modello Binding in asp.net 4.5 per formattare i campi data

  <asp:TextBox 
       ID="DateFieldTextBox" 
       runat="server" 
       Text='<%# Bind("DateField","{0:d}") %>'/> 

Il nuovo binding del modello fortemente tipizzato è un po 'più difficile.

  <asp:TextBox 
       ID="DateFieldTextBox" 
       runat="server" 
       Text='<%# BindItem.DateField %>'/> 

funzionerà, ma produce la stringa di data/ora completa anziché solo la data.

  <asp:TextBox 
       ID="DateFieldTextBox" 
       runat="server" 
       Text='<%# BindItem.DateField.ToShortDateString() %>'/> 

.. questo dovrebbe funzionare, ma si produce un errore di compilazione "sintassi del codice non valido per BindItem". Item.DateField.ToShortDateString() funziona ma non si associa al postback.

Per ora abbiamo ripristinato la vecchia sintassi, ma ci piacerebbe ottenere il controllo del tempo di compilazione moderno ma essere ancora in grado di formattare le date in modo corretto. Qualcun altro si è imbattuto in questo prima?

+0

anche non funziona quando si cerca questo: ' '<% # string.Format (CultureInfo.CurrentCulture, "{0: d}", BindItem.InfoBirthday)%>'', dice: errore del compilatore Messaggio: CS0103: il nome "BindItem" non esiste nel contesto corrente –

+0

http://stackoverflow.com/questions/17824427/how-do-i-format-a-date-pulled-from-a-database/17831740 # 17831740 – SK2185

+0

http://stackoverflow.com/questions/17824427/how-do-i-format-a-date-pulled-from-a-database/17831740#17831740 – SK2185

risposta

2

Per visualizzare i dati nella visualizzazione griglia, è possibile eseguire Item.DateField.ToShortString() e funzionerà come se fosse un collegamento dati unidirezionale. tu stai disputando ciò che è già nel record. BindItem.DateField.ToDateString() convertirà l'oggetto da DateTime in stringa che genererà un errore come si sta già vedendo. È possibile continuare a utilizzare Bind (espressione, formato) in formview mentre si modifica il campo o si accede alla nuova voce.

0

Ci scusiamo per aver resuscitato questo thread, ma hai preso in considerazione l'aggiunta di Annotazioni dati alla classe del tuo modello? In altre parole:

using System.ComponentModel.DataAnnotations; 

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
public DateTime DateField { get; set; } 

Questo sembra funzionare per me, anche se non conosco i dettagli del tuo caso.

1

Ho lottato con questo per un po 'di tempo. La mia soluzione consisteva nel combinare le annotazioni dei dati nel modello di dati con l'uso di un DynamicControl nel mio FormView. Ho pensato che questo sia un progetto WebForms rispetto a un progetto MCV.

Leggere un po 'sul regno di data access in WebForms. È uno dei migliori resoconti di MS sui controlli di accesso/presentazione ai dati di WebForms e include riferimenti a DynamicControl.

//I know you want this, and I did too. It seems like it could/should work, but it doesn't   
<asp:TextBox 
    ID="DateFieldTextBox" 
    runat="server" 
    Text='<%# BindItem.DateField.ToShortDateString() %>'/> 

//This works, but you also need to use the Data Annotations in your model. 
<asp:DynamicControl 
    ID="DateFieldTextBox" 
    runat="server" 
    DataField="DateField" 
    Mode="Edit" /> 

//sample model annotations in your object class 
    [Column(TypeName = "date"), DataType(DataType.Date), DisplayFormat(DataFormatString = " {0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime DateField { get; set; } 

sarò con questo schema, perché ho bisogno del modello a due vie vincolante con la capacità di presentare le date nel formato giusto (così come valuta, ecc). È davvero un peccato che il controllo TextBox non gestisca completamente la formattazione dei dati del modello come questo. Le annotazioni di dati sono ignorate in questo contesto. L'associazione bidirezionale funziona se non c'è formattazione, ma non se hai bisogno di formattazione. Sembra un'implementazione IMO incompleta di WebForms.

D'altra parte, l'utilizzo di DynamicControl funziona, ma non si ottiene Intellisense sulla proprietà DataField che fornirà membri del modello durante la codifica. Che cosa???? Un'altra soluzione incompleta e meno preferita.

+0

L'idea qui ha funzionato per me (vincolante in un ripetitore). Annotato la proprietà con DisplayFormat e utilizzato DynamicControl anziché BindItem.Bind. Anche Intellisense funziona all'interno del controllo dinamico, il che è bello. – PaulTheCyclist

1

Finalmente dopo aver lottato per due giorni ricevo una soluzione per questo problema due modelli modo vincolante per valore del campo formattato. Basta rimuovere le virgolette singole o doppie "" o "" dopo il testo delle proprietà del TextBox. Funziona per me come un fascino !! Ma se si utilizza la proprietà TextMode di TextBox su Data, rimuoverlo. Causa, non visualizzerà un valore dal server o dal DB. Se si desidera utilizzare un DatePicker o un calendario, è possibile aggiungere semplicemente un controllo AJAX CalendarExtender per selezionare una data dal calendario.

<asp:TextBox ID="DateFieldTextBox" runat="server" Text=<%# Bind("DateField","{0:d}") %>/>