Comment puis-je formater des données provenant d'une instruction DataBinder.Eval dans une page ASPX?
Par exemple, je souhaite afficher la date de publication des articles dans un format particulier sur la page d'accueil. J'utilise le contrôle Répéteur ASP.NET 2.0 pour afficher la liste des actualités.
Le code pour cela va comme ceci:
<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>
Existe-t-il un moyen d'appeler une méthode personnalisée avec la valeur DataBinder.Eval comme paramètre (quelque chose comme ci-dessous)?
<asp:Label ID="lblNewsDate" runat="server" Text='<%# GetDateInHomepageFormat(DataBinder.Eval(Container.DataItem, "publishedDate")) )%>'></asp:Label>
Si oui, alors où dois-je écrire la méthode GetDateInHomepageFormat? J'ai essayé dans le code derrière la page mais j'ai une erreur d'exécution? Si cela n'est pas possible, existe-t-il un moyen de procéder au formatage en ligne?
Il existe une surcharge facultative pour DataBinder.Eval pour fournir le formatage:
<%# DataBinder.Eval(Container.DataItem, "expression"[, "format"]) %>
Le paramètre de format est une valeur de chaîne, utilisant la syntaxe de remplacement de l'espace réservé de valeur (appelée formatage composite) comme ceci:
<asp:Label id="lblNewsDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "publishedDate", "{0:dddd d MMMM}") %>'</label>
Après quelques recherches sur Internet, j'ai constaté que il est en fait très possible d'appeler une méthode personnalisée en passant la valeur DataBinder.Eval.
La méthode personnalisée peut être écrite dans le code derrière le fichier, mais doit être déclarée public ou protected. Dans ma question ci-dessus, j'avais mentionné que j'avais essayé d'écrire la méthode personnalisée dans le code derrière mais que j'obtenais une erreur d'exécution. La raison en était que j'avais déclaré que la méthode était privé.
Donc, en résumé, ce qui suit est un bon moyen d'utiliser la valeur DataBinder.Eval pour obtenir la sortie souhaitée:
default.aspx
<asp:Label ID="lblNewsDate" runat="server" Text='<%# GetDateInHomepageFormat(DataBinder.Eval(Container.DataItem, "publishedDate")) )%>'></asp:Label>
code default.aspx.cs:
public partial class _Default : System.Web.UI.Page
{
protected string GetDateInHomepageFormat(DateTime d)
{
string retValue = "";
// Do all processing required and return value
return retValue;
}
}
J'espère que cela aide aussi les autres.
Pourquoi ne pas utiliser la syntaxe plus simple?
<asp:Label id="lblNewsDate" runat="server" Text='<%# Eval("publishedDate", "{0:dddd d MMMM}") %>'</label>
Voici le modèle de contrôle "Eval" qui prend en compte l'expression et le format de chaîne:
protected internal string Eval(
string expression,
string format
)
Vous pouvez utiliser une fonction dans un répéteur comme vous l'avez dit, mais notez que DataBinder.Eval renvoie un objet et que vous devez le convertir en DateTime.
Vous pouvez également formater votre champ en ligne:
<%# ((DateTime)DataBinder.Eval(Container.DataItem,"publishedDate")).ToString("yyyy-MMM-dd") %>
Si vous utilisez ASP.NET 2.0 ou une version plus récente, vous pouvez écrire ceci comme ci-dessous:
<%# ((DateTime)Eval("publishedDate")).ToString("yyyy-MMM-dd") %>
Une autre option consiste à lier la valeur à l'étiquette lors de l'événement OnItemDataBound.
Cette ligne a résolu mon problème:
<%#DateTime.Parse(Eval("DDDate").ToString()).ToString("dd-MM-yyyy")%>
Pour formater la date en utilisant le format de date local, utilisez:
<%#((DateTime)Eval("ExpDate")).ToString("d")%>
Text = '<% # DateTime.Parse (Eval ("LastLoginDate"). ToString ()). ToString ("MM/dd/yyyy hh: mm tt")%>'
Cela fonctionne pour le format que vous souhaitez
Merci à tous. J'étais coincé sur des chaînes de format standard depuis un certain temps. J'ai également utilisé une fonction personnalisée dans VB.
Marquer:-
<asp:Label ID="Label3" runat="server" text='<%# Formatlabel(DataBinder.Eval(Container.DataItem, "psWages1D")) %>'/>
Code derrière: -
Public Function fLabel(ByVal tval) As String
fLabel = tval.ToString("#,##0.00%;(#,##0.00%);Zero")
End Function
Vous pouvez l'utiliser de cette façon dans la page aspx
<%# DataBinder.Eval(Container.DataItem, "DateColoumnName", "{0:dd-MMM-yyyy}") %>
<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>