Адаптация метода DataBinder.Eval

В данной статье рассматривается, как с помощью методов DataBinder.Eval и DataBinder.Bind можно изменить форматирование данных из связанного источника данных. Рассмотрим страницу на ASP.Net, на которой расположен FormView или подобный объект с содержимым из источника данных. Код страницы приведен ниже.

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    <title>Адаптация метода Eval</title>
</head>
<body id="m_body" topmargin="1" leftmargin="0" bottommargin="1" rightmargin="0" style="cursor: auto;">
    <form id="m_form" runat="server">
    <asp:SqlDataSource ID="m_source" runat="server" ConnectionString="<%$ ConnectionStrings:MainConnection %>"
        SelectCommand="SELECT DATEADD(dd, -DATEPART(dd, GETDATE()) + 1, GETDATE()) AS [Date], SERVERPROPERTY('ServerName') AS [Name]"
        SelectCommandType="Text"></asp:SqlDataSource>
    <asp:FormView ID="m_title" runat="server" DataSourceID="m_source" DataKeyNames="Date">
        <ItemTemplate>
            Сервер: 
            <asp:Label ID="m_name_text" runat="server" Text='<%# Eval("Name") %>' Font-Bold="true"></asp:Label>,
            <br />
            Первый день текущего месяца 
            <asp:Label ID="m_date_text" runat="server" Text='<%# Eval("Date") %>'></asp:Label>.
        </ItemTemplate>
    </asp:FormView>
    </form>
</body>
</html>

Для корректного запуска, еще потребуется файл web.config с указанием строки подключения:

  <connectionStrings>
    <add connectionString="Data Source=TESTSERVERWORDPRESS;Trusted_Connection=yes;Persist Security Info=false;Timeout=1200;"
        name="MainConnection" providerName="System.Data.SqlClient" />
  </connectionStrings>

В некоторых случаях, требуется выполнить форматирование выводимых данных, для чего подходит метод DataBinder.Eval. Но использовать его можно несколькими способами. В простом варианте вторым аргументом указываем строку форматирования:
<asp:Label ID="m_date_text1" runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "Date", "{0:dd.MM}") %>'></asp:Label>

Если стандартных параметров форматирования не хватает, то можно определить два метода
string GetFormatString() и string FormatValue( object value ).
Первый метод возвращает строку форматирования объекта, что позволяет, например, модифицировать формат данных в зависимости от параметров запроса или страницы. Второй метод возвращает строку с форматированным значением. При этом, если метод GetFormatString() не используется или результат его выполнения null, то параметр value имеет тип данных object (который обворачивает объект исходного типа из источника данных), и тип string — в остальных случаях.
В дополнение к этому, метод FormatValue позволяет возвращать значение с добавленными html тегами.
Ниже приведен код страницы с использованием функций форматирования, который (в качестве примера) формируют строку с описанием текущего квартала.

 <%@ Page Language="C#" AutoEventWireup="true" %>

<script runat="server">
    public string GetFormatString()
    {
        /// построение строки форматирования объекта типа DateTime
        return "{0:dd.MM.yyyy г.}";
    }

    public string FormatValue1( string date )
    {
        /// проверки и манипуляции с отформатированым значением
        string quarter = null;
        if ( date.StartsWith( "01.01." ) || date.StartsWith( "01.02." ) || date.StartsWith( "01.03." ) )
            quarter = "I  квартал ";
        else if ( date.StartsWith( "01.04." ) || date.StartsWith( "01.05." ) || date.StartsWith( "01.06." ) )
            quarter = "II  квартал ";
        else if ( date.StartsWith( "01.07." ) || date.StartsWith( "01.08." ) || date.StartsWith( "01.09." ) )
            quarter = "III  квартал ";
        else
            quarter = "IV  квартал ";

        //return date.Replace( date.Substring( 0, 6 ), quarter );
        return String.Format( "<span style = "color: BlueViolet">{0}{1}</span>",
            quarter,
            date.Substring( 6 ) );
    }

    public string FormatValue2( object value )
    {
        /// проверка
        if ( !(value is DateTime) )
            return "Неправильный тип объекта";

        string quarter = null;
        DateTime date = (DateTime)value;
        switch ( ((date.Month - 1) / 3) * 3 + 1 )
        {
        case 1:
            quarter = "I  квартал ";
            break;

        case 4:
            quarter = "II  квартал ";
            break;

        case 7:
            quarter = "III  квартал ";
            break;

        case 10:
        default:
            quarter = "IV  квартал ";
            break;
        }

        return date.ToString( String.Format( "{0} yyyy г.", quarter ) );
    }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    <title>Адаптация метода Eval</title>
</head>
<body id="m_body" topmargin="1" leftmargin="0" bottommargin="1" rightmargin="0" style="cursor: auto;">
    <form id="m_form" runat="server">
    <asp:SqlDataSource ID="m_source" runat="server" ConnectionString="<%$ ConnectionStrings:MainConnection %>"
        SelectCommand="SELECT DATEADD(dd, -DATEPART(dd, GETDATE()) + 1, GETDATE()) AS [Date], SERVERPROPERTY('ServerName') AS [Name]"
        SelectCommandType="Text"></asp:SqlDataSource>
    <asp:FormView ID="m_title" runat="server" DataSourceID="m_source" DataKeyNames="Date">
        <ItemTemplate>
            Сервер: 
            <asp:Label ID="m_name_text" runat="server" Text='<%# Eval("Name") %>' Font-Bold="true"></asp:Label>,
            <br />
            Первый день текущего месяца 
            <asp:Label ID="m_date_text" runat="server" Text='<%# Eval("Date") %>'></asp:Label>
            , квартал:
            <br />
            2 функции: <asp:Label ID="m_date_text1" runat="server" Text='<%# FormatValue1( DataBinder.Eval(Container.DataItem, "Date", GetFormatString())) %>'></asp:Label>
            <br />
            1 функция: <asp:Label ID="m_date_text2" runat="server" Text='<%# FormatValue2( DataBinder.Eval(Container.DataItem, "Date")) %>'></asp:Label>
        </ItemTemplate>
    </asp:FormView>
    </form>
</body>
</html>

Результат выполнения страницы:

Внешний вид страницы с адаптацией метода Eval

Адаптация метода Eval

Кстати, если использовать метод DataBinder.Bind() вместо DataBinder.Eval(), то подобный подход неприменим, поскольку конструкция <%# Bind("Name") %>
— не совсем вызов метода. См., например, заметку.


  1. Все используемые IP-адреса, имена серверов, компьютеров, доменов, пользователей, являются фиктивными и используются исключительно в демонстрационных целях.
  2. Информация приводится «AS IS».
Pin It

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.