Создание специализированных элементов управления параметрами (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" />