В данной статье рассматривается, как с помощью методов 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>
Результат выполнения страницы:
Кстати, если использовать метод DataBinder.Bind()
вместо DataBinder.Eval()
, то подобный подход неприменим, поскольку конструкция <%# Bind("Name") %>
— не совсем вызов метода. См., например, заметку.
- Все используемые IP-адреса, имена серверов, компьютеров, доменов, пользователей, являются фиктивными и используются исключительно в демонстрационных целях.
- Информация приводится «AS IS».