Создание специализированных элементов управления параметрами (Parameter Controls) в ASP.NET 2.0 - Создание элемента управления Parameter для получения текущего времени и даты
ОГЛАВЛЕНИЕ
Создание элемента управления Parameter для получения текущего времени и даты
Бывают случаи когда нам нужно получить текущую дату и время и вставить их в конкретное значение времени\даты. К примеру, представьте, что у нас база данных Employees (сотрудники), где среди прочих колонок у нас будет колонка даты принятия на работу работника (HireDate). При добавлении нового работника посредством веб-сайта, нам наверняка захочется иметь значение текущей даты и времени в HireDate. Либо нам необходимо будет иметь элемент управления данными, который возвращает список всех сотрудников, нанятых за день. К сожалению, не существует встроенного элемента управления Parameter , который возвращал бы текущие дату и время, что означает, что нам надо установить данное значение программным путем.
Давайте исследуем способ создания нашего собственного элемента управления TodayParameter, который возвращает текущую дату (и в качестве опции - время). Код, который мы рассмотрим, написан на языке VB.
В приложении вы найдете решение в формате Visual Studio 2005, которое включает в себя два проекта: skmParameters, проект Visual Basic Control Library, и TestWebsite, который является веб-сайтом, основанным на файловой системе для тестирования skmParameters. Файл TodayParameter.vb в skmParameters включает в себя код для элемента управления TodayParameter. В простейшей форме мы сможем создать элемент управления TodayParameter таким образом, что он будет возвращать нам текущие дату и время:
Imports System.ComponentModel
Imports System.Web.UI.WebControls
Public Class TodayParameter
Inherits Parameter
Protected Overrides Function Evaluate(ByVal context As System.Web.HttpContext, ByVal control As System.Web.UI.Control) As Object
Return DateTime.Now
End Function
End Class
И это все! Конечно, без метода Clone() элемент управления TodayParameter должен быть изменен посредством декларативного синтаксиса, но все же это удовлетворяет минимальным требованиям. Для того, чтобы использовать данный параметр в ASP.NET-странице вам сначала понадобится добавть ссылку на проект (либо перетащить DLL из проекта в каталог сайта /bin), и затем "зарегистрировать" элемент управления (либо на уровне страницы, либо в Web.config). На уровне страницы это может быть выполнено используя директиву <% @Register %> следующим образом:
<%@ Register Assembly="skmParameters" Namespace="skmParameters" TagPrefix="skm" %>
Далее, в одном из наборов параметров SqlDataSource либо ObjectDataSources вы можете использовать элемент управления TodayParameter. В приложении к данной статье вы найдете пример страницы (TodayParameter.aspx) , предоставляющей DetailsView , который позволяет добавление новых сотрудников в таблицу Employees. При добавлении нового сотрудника значение HireDate определяется при помощи элемента управления TodayParameter (что в результате дает текущую дату/время). Синтаксис для SqlDataSource будет следующим:
<asp:SqlDataSource ID="EmployeesDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
InsertCommand="INSERT INTO [Employees] ([Name], [Salary], [HireDate]) VALUES (@Name, @Salary, @HireDate)"
SelectCommand="SELECT [EmployeeID], [Name], [Salary], [HireDate] FROM [Employees]">
<InsertParameters>
<asp:Parameter Name="Name" Type="String" />
<asp:Parameter Name="Salary" Type="Decimal" />
<skm:TodayParameter Name="HireDate" />
</InsertParameters>
</asp:SqlDataSource>
Заметьте, что InsertCommand обладает параметром, названным @HireDate. Значение данного параметра указывается через TodayParameter из набора InsertParameters.
Мы можем далее расширить параметр TodayParameter путем предоставления свойства, которое указывает на то, что значение, которое необходимо вернуть, будет текущей датой либо временем:
Public Property IncludeTime() As Boolean
Get
Dim o As Object = ViewState("IncludeTime")
If o Is Nothing Then
Return True 'value not set, return default
Else
Return CType(o, Boolean)
End If
End Get
Set(ByVal value As Boolean)
ViewState("IncludeTime") = value
End Set
End Property
Заметьте, что данное свойство сохраняет свое значение в наборе ViewState класса Parameter. Это обеспечит сохранение значения среди постбэков в случае, если значение данного свойства будет программно изменено.
Определив данное свойство мы можем обновить метод Evaluate() таким образом, чтобы оно теперь возвращало только текущую дату (без времени) в случае если IncludeTime равняется False:
Protected Overrides Function Evaluate(ByVal context As System.Web.HttpContext, ByVal control As System.Web.UI.Control) As Object
If IncludeTime Then
Return DateTime.Now
Else
Return DateTime.Now.Date
End If End Function
Также можно изменить декларативную разметку элемента управления TodayParameter таким образом, чтобы она включала в себя данное значение (хотя на самом деле оно нужно только в случае, если вам необходимо передать время, поскольку значение по умолчанию IncludeTime равно True.
<skm:TodayParameter Name="HireDate" IncludeTime="False" />