格式化DataBinder.Eval数据

30

在ASPX页面中,我该如何格式化来自DataBinder.Eval语句的数据?

例如,我想以特定的格式显示主页上新闻项目的发布日期。 我正在使用ASP.NET 2.0 Repeater控件来显示新闻项目列表。

代码如下:

<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>
有没有一种方法可以使用 DataBinder.Eval 的值作为参数来调用自定义方法(类似下面的代码)?
有没有办法使用DataBinder.Eval值作为参数来调用自定义方法(类似下面的代码)?
<asp:Label ID="lblNewsDate" runat="server" Text='<%# GetDateInHomepageFormat(DataBinder.Eval(Container.DataItem, "publishedDate")) )%>'></asp:Label>

如果可以的话,那么我应该在哪里编写GetDateInHomepageFormat方法?我尝试在代码后台页面中编写,但出现了运行时错误?如果不可能,在行内进行格式化有什么办法吗?

10个回答

59

有一个可选的DataBinder.Eval重载以提供格式化:

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

格式参数是一个字符串值,使用占位符替换语法(称为组合格式化),例如:
<asp:Label id="lblNewsDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "publishedDate", "{0:dddd d MMMM}") %>'</label>

2
很棒的答案...同时值得添加这个链接,其中包含所有C#日期时间字符串格式:http://www.csharp-examples.net/string-format-datetime/ - naveen
很好的回答,但我想指出标签示例中格式表达式末尾缺少'}'和多余的']'。应该是:...,"{0:dddd d MMMM}") %>'</label> - PhillFox
3
因为这篇文章在谷歌搜索结果中仍然很高,所以我在这里回复。请记住,使用Eval时存在性能惩罚(由于后期绑定)。为了格式化输出,我更喜欢将显式转换传递给函数,例如:<%# Format(((DeliveryDataType)Container.DataItem).DeliveryDate, "dd.MM.yy")%>。 - ingredient_15939
应该将 "expression"[, "format"]) 改为 "expression", ["format"])。 - sohaiby

14

在互联网上搜索后,我发现实际上非常可能调用传递DataBinder.Eval值的自定义方法。

自定义方法可以在代码后台文件中编写,但必须声明为publicprotected。如上面我的问题中所述,我尝试将自定义方法编写在代码后台中,但遇到了运行时错误。这是由于我将该方法声明为private

因此,总结一下,以下是使用DataBinder.Eval值获取所需输出的好方法:

default.aspx

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

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;
    }
}

希望这也能帮助其他人。


12

为什么不使用更简单的语法?

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

这是模板控件“Eval”,它接受表达式和字符串格式:

protected internal string Eval(
string expression,
string format

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


11

你可以像你所说的那样在一个重复器中使用函数,但请注意DataBinder.Eval返回一个对象,你需要将其强制转换为DateTime。

你也可以内联格式化你的字段:

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

如果你使用的是ASP.NET 2.0或更高版本,你可以按照下面的方式编写:

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

另一个选项是在 OnItemDataBound 事件中将值绑定到标签。


完美!这就是我需要的。 - Khaneddy2013

3
这行代码解决了我的问题:
<%#DateTime.Parse(Eval("DDDate").ToString()).ToString("dd-MM-yyyy")%>

@Wahab:只要您愿意在行内进行格式设置,那就太完美了。然而,最初的问题是如何使用自定义方法来进行格式设置。这样做的想法是您可以重复使用自定义方法并减少 ASPX 页面中的复杂性。干杯! - Nahom Tijnam

2

1
感谢大家,我一直卡在标准格式字符串上。我还在VB中使用了自定义函数。
标记:-
<asp:Label ID="Label3" runat="server" text='<%# Formatlabel(DataBinder.Eval(Container.DataItem, "psWages1D")) %>'/>

代码后端:

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

1

文本='<%# DateTime.Parse(Eval("LastLoginDate").ToString()).ToString("MM/dd/yyyy hh:mm tt") %>'

这将按您想要的格式运行


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
<asp:TemplateColumn HeaderText="Begin Date"> <ItemTemplate> <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> </ItemTemplate> </asp:TemplateColumn> - jojy
这段代码检查日期是否为空,如果不为空,则格式化并存储日期! - jojy

0

你可以在 aspx 页面中这样使用它

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接