2012-08-31 9 views
8

En los días anteriores a asp.net 4.5 podíamos enlazar fácilmente una fecha a un Gridview, Formview u otro control de datos y hacerlo lucir presentable con un formato simple cuerda.Usando el nuevo Enlace de modelo en asp.net 4.5 para formatear campos de fecha

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

El nuevo encuadernado con modelo muy tipado es un poco más difícil.

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

funcionará, pero produce la cadena completa de fecha/hora en lugar de solo la fecha.

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

.. esto debería funcionar, pero se produce un error de tiempo de compilación "sintaxis de código no válido para BindItem". Item.DateField.ToShortDateString() funciona pero no se vincula en la devolución de datos.

Por ahora hemos vuelto a la sintaxis anterior, pero nos encantaría obtener la comprobación de tiempo de compilación moderna, pero todavía ser capaz de formatear las fechas muy bien. ¿Alguien más se encontró con esto antes?

+0

también no funciona cuando se trata de esto: ' '<% # string.Format (CultureInfo.CurrentCulture, "{0: d}", BindItem.InfoBirthday)%>' ', que dice: Error del compilador Mensaje: CS0103: el nombre 'BindItem' no existe en el contexto actual –

+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

Respuesta

2

Para mostrar datos en la vista de cuadrícula, puede hacer Item.DateField.ToShortString() y funcionará ya que es un enlace de datos de una manera. es decir, usted está informando sobre lo que ya está en el registro. BindItem.DateField.ToDateString() convertirá el objeto de DateTime a string lo que dará como resultado un error como el que ya está viendo. Puede seguir usando Bind (expresión, formato) en vista de formulario mientras edita el campo o para acusar nueva entrada.

0

Disculpas por resucitar este hilo, pero ¿consideraste agregar Anotaciones de datos a tu clase de modelo? En otras palabras:

using System.ComponentModel.DataAnnotations; 

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

Esto parece funcionar para mí, aunque no conozco los pormenores de su caso.

1

Luché con esto por bastante tiempo. Mi solución fue combinar anotaciones de datos en el modelo de datos junto con el uso de un DynamicControl en mi FormView. Supuse que este es un proyecto de WebForms frente a un proyecto de MCV.

Lea un poco en el reino de data access in WebForms. Es uno de los mejores informes de MS sobre los controles de acceso/presentación de datos de WebForms e incluye referencias 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; } 

voy a estar utilizando este patrón porque necesito vinculante con la capacidad de presentar las fechas en el formato correcto modelo de dos vías (así como la moneda, etc.). Es realmente desafortunado que el control TextBox no maneje el formateo de los datos del modelo de esta manera. Las anotaciones de datos se ignoran en este contexto. El enlace bidireccional funciona si no hay formateo, pero no si necesita formatearlo. Parece una implementación incompleta de WebForms IMO.

Por otro lado, el uso de DynamicControl funciona, pero no obtiene Intellisense en la propiedad DataField que le proporcionará miembros del modelo durante la codificación. ¿¿¿¿Qué???? Otra solución incompleta y menos preferida.

+0

La idea aquí funcionó para mí (vinculante en un repetidor). Anotó la propiedad con DisplayFormat y utilizó DynamicControl en lugar de BindItem.Bind. Intellisense también funciona dentro del control dinámico, lo que es bueno. – PaulTheCyclist

1

Por fin, después de luchar durante dos días, recibí una solución para este problema de enlace de modelo de dos vías para el valor de campo formateado. Simplemente elimine la comilla simple o doble "" o "" después del texto de la propiedad del TextBox. ¡Me funciona como un encanto! Pero si usa la propiedad TextMode del TextBox hasta la fecha, quítelo. Porque no mostrará un valor del servidor o DB. Si desea utilizar un marcador de fecha o un calendario, puede simplemente agregar un control AJAX CalendarExtender para elegir una fecha del calendario.

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