Форматирование DataBinder.Eval данных - PullRequest
29 голосов
/ 08 ноября 2008

Как мне отформатировать данные, поступающие из оператора DataBinder.Eval на странице ASPX?

Например, я хочу отобразить дату публикации новостей в определенном формате на главной странице. Я использую элемент управления повторителя ASP.NET 2.0 для отображения списка новостей.

Код для этого выглядит так:

<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 в качестве параметра (что-то вроде ниже)?

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

Если да, то где мне написать метод GetDateInHomepageFormat? Я пробовал в коде позади страницы, но получил ошибку во время выполнения? Если это невозможно, есть ли способ сделать встроенное форматирование?

Ответы [ 10 ]

57 голосов
/ 09 ноября 2008

Существует дополнительная перегрузка для DataBinder.Eval для предоставления форматирования:

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

Параметр format представляет собой строковое значение, использующее синтаксис замены заполнителя значения (называемый составным форматированием), например:

<asp:Label id="lblNewsDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "publishedDate", "{0:dddd d MMMM}") %>'</label>
14 голосов
/ 09 ноября 2008

После некоторых поисков в Интернете я обнаружил, что на самом деле очень возможно вызвать пользовательский метод, передавая значение DataBinder.Eval.

Пользовательский метод может быть записан в коде файла, но должен быть объявлен public или protected . В моем вопросе выше я упоминал, что пытался написать собственный метод в коде, но получал ошибку во время выполнения. Причиной этого было то, что я объявил метод 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 голосов
/ 17 мая 2011

Почему бы не использовать более простой синтаксис?

<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 голосов
/ 09 ноября 2008

Вы можете использовать функцию в ретрансляторе, как вы сказали, но обратите внимание, что 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.

3 голосов
/ 31 июля 2009

Эта строка решила мою проблему:

<%#DateTime.Parse(Eval("DDDate").ToString()).ToString("dd-MM-yyyy")%>
2 голосов
/ 04 октября 2011

Для форматирования даты с использованием локального формата даты используйте:

<%#((DateTime)Eval("ExpDate")).ToString("d")%>

Как отформатировать оператор Eval для отображения даты с использованием локали даты

1 голос
/ 27 октября 2014

Text = '<% # DateTime.Parse (Eval ("LastLoginDate"). ToString ()). ToString ("MM / дд / гггг чч: мм тт")%>'

Это работает для формата, как вы хотите

1 голос
/ 14 октября 2011

Спасибо всем. Я застрял в стандартном формате строки в течение некоторого времени. Я также использовал пользовательскую функцию в 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
0 голосов
/ 22 октября 2009

Вы можете использовать его таким образом на странице aspx

<%# DataBinder.Eval(Container.DataItem, "DateColoumnName", "{0:dd-MMM-yyyy}") %>
0 голосов
/ 17 сентября 2009
<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>
...