2008-11-08 61 views
29

¿Cómo puedo formatear datos provenientes de una declaración DataBinder.Eval en una página ASPX?Formateo de datos de DataBinder.Eval

Por ejemplo, quiero mostrar la fecha de publicación de las noticias en un formato particular en la página de inicio. Estoy usando el control ASP.NET 2.0 Repeater para mostrar la lista de noticias.

El código para esta dice así:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1"> 
<HeaderTemplate><table cellpadding="0" cellspacing="0" width="255"></HeaderTemplate> 
<ItemTemplate> 
    <tr><td > 
      <a href='/content/latestNews.aspx?id=<%#DataBinder.Eval(Container.DataItem, "id") %>'> 
       <asp:Label ID="lblNewsTitle" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "title") %>'></asp:Label> 
      </a> 
    </td></tr> 
    <tr><td> 
      <asp:Label ID="lblNewsDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "publishedDate"))%>'></asp:Label> 
    </td></tr> 
</ItemTemplate> 
<FooterTemplate></table></FooterTemplate></asp:Repeater> 

¿Hay alguna manera de que pudiera llamar a un método personalizado con el valor DataBinder.Eval como parámetro (algo así como más adelante)?

<asp:Label ID="lblNewsDate" runat="server" Text='<%# GetDateInHomepageFormat(DataBinder.Eval(Container.DataItem, "publishedDate")))%>'></asp:Label> 

En caso afirmativo, ¿dónde debo escribir el método GetDateInHomepageFormat? Probé en el código detrás de la página, pero obtuve un error de tiempo de ejecución? Si esto no es posible, ¿hay alguna forma de hacer el formateo en línea?

Respuesta

57

hay una sobrecarga opcional para DataBinder.Eval para el suministro de formato:

<%# DataBinder.Eval(Container.DataItem, "expression"[, "format"]) %> 

El parámetro formato es un valor de cadena, utilizando la sintaxis de reemplazo marcador de posición valor (llamado formato compuesto) como esto:

<asp:Label id="lblNewsDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "publishedDate", "{0:dddd d MMMM}") %>'</label> 
+2

gran respuesta ... también vale la pena añadir este enlace f o todo el C# String Format para DateTime en http://www.csharp-examples.net/string-format-datetime/ – naveen

+0

Buena respuesta, pero solo quiero señalar que falta un '}' y un extra ' ] 'al final de la expresión de formato en el ejemplo de etiqueta arriba. Debería ser: ..., "{0: dddd d MMMM}")%> ' – PhillFox

+0

@PhillFox Buena captura. Gracias, lo arreglé – DOK

11

Puede usar una función en un repetidor como usted dijo, pero observe que DataBinder.Eval devuelve un objeto y debe convertirlo a DateTime.

También puede dar formato a su línea de campo:

<%# ((DateTime)DataBinder.Eval(Container.DataItem,"publishedDate")).ToString("yyyy-MMM-dd") %> 

Si utiliza ASP.NET 2.0 o posterior puede escribir esto como a continuación:

<%# ((DateTime)Eval("publishedDate")).ToString("yyyy-MMM-dd") %> 

Otra opción es unir el valor de etiqueta en el evento OnItemDataBound.

+0

¡Perfecto! Esto es lo que necesito – Khaneddy2013

14

Después de algunas búsquedas en Internet encontré que es de hecho muy posible llamar a un método personalizado que pasa el valor de DataBinder.Eval.

El método personalizado se puede escribir en el archivo de código subyacente, pero tiene que ser declarado pública o protegida. En mi pregunta anterior, mencioné que traté de escribir el método personalizado en el código subyacente, pero estaba obteniendo un error de tiempo de ejecución. La razón de esto fue que yo había declarado que el método era privado.

Así, en resumen lo siguiente es una buena manera de utilizar el valor DataBinder.Eval para obtener su salida deseada:

default.aspx

<asp:Label ID="lblNewsDate" runat="server" Text='<%# GetDateInHomepageFormat(DataBinder.Eval(Container.DataItem, "publishedDate")))%>'></asp:Label> 

default.aspx.cs código:

public partial class _Default : System.Web.UI.Page 
{ 

    protected string GetDateInHomepageFormat(DateTime d) 
    { 

     string retValue = ""; 

     // Do all processing required and return value 

     return retValue; 
    } 
} 

Espero que esto ayude a los demás también.

3

Esta línea resuelto mi problema:

<%#DateTime.Parse(Eval("DDDate").ToString()).ToString("dd-MM-yyyy")%> 
+0

@Wahab: es perfecto, siempre y cuando esté contento de hacer el formateo en línea. Sin embargo, la pregunta original era cómo podría usar un método personalizado para hacer el formateo. La idea es que podría volver a utilizar el método personalizado y reducir la complejidad en la página ASPX. Aclamaciones. –

0
<asp:Label ID="ServiceBeginDate" runat="server" Text='<%# (DataBinder.Eval(Container.DataItem, "ServiceBeginDate", "{0:yyyy}") == "0001") ? "" : DataBinder.Eval(Container.DataItem, "ServiceBeginDate", "{0:MM/dd/yyyy}") %>'> 
</asp:Label> 
+2

+0

Esto comprueba si la fecha es NULL y si no se formatea y almacena la fecha! –

0

Usted puede usarlo de esta manera en la página aspx

<%# DataBinder.Eval(Container.DataItem, "DateColoumnName", "{0:dd-MMM-yyyy}") %> 
12

Por qué no utilizar la sintaxis más simple?

<asp:Label id="lblNewsDate" runat="server" Text='<%# Eval("publishedDate", "{0:dddd d MMMM}") %>'</label> 

Este es el control de plantilla "Eval" que lleva en la expresión y el formato de cadena:

protected internal string Eval(
string expression, 
string format 

)

http://msdn.microsoft.com/en-us/library/3d2sz789.aspx

1

Gracias a todos. Estuve atascado en cadenas de formato estándar durante algún tiempo. También utilicé una función personalizada en VB.

Marcos Up: -

<asp:Label ID="Label3" runat="server" text='<%# Formatlabel(DataBinder.Eval(Container.DataItem, "psWages1D")) %>'/> 

Código atrás: - (. Eval ("LastLoginDate") ToString()).

Public Function fLabel(ByVal tval) As String 
    fLabel = tval.ToString("#,##0.00%;(#,##0.00%);Zero") 
End Function 
1

texto =' <% # DateTime.Parse ToString ("mM/dd/aaaa hh: mm tt")%>'

esto funciona para el formato que desea