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