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

Рассмотрим страницу на ASP.Net, на которой расположен FormView или подобный объект с содержимым из источника данных. Код страницы приведен ниже.

************************ TestEval.aspx, v.1 *************************
<%@ 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”&gt;
<html xmlns=”http://www.w3.org/1999/xhtml”&gt;
<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>
************************ End of TestEval.aspx, v.1 *************************
Для корректного запуска, еще потребуется файл web.config с указанием строки подключения:

<connectionStrings>
<add connectionString="Data Source=TESTSERVER\WORDPRESS;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 тегами.
Ниже приведен код страницы с использованием функций форматирования, который (в качестве примера) формируют строку с описанием текущего квартала.

************************ TestEval.aspx, v.2 *************************
<%@ 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”&gt;
<html xmlns=”http://www.w3.org/1999/xhtml”&gt;
<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>
************************ End of TestEval.aspx, v.2 *************************

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

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

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


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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s