Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Технология .NET. ASP.NET, ADO.NET. Язык C#.


Информационный Канал Subscribe.Ru


 Технология .NET: ASP.NET, ADO.NET, C#

Тематическая рассылка сайта http://www.daoto.net/

 Технология .NET: ASP.NET, ADO.NET, C#

Тематическая рассылка сайта http://www.daoto.net/

Выпуск 3-ий.

Доброго дня, уважаемые читатели!

Перед вами третий выпуск рассылки сайта Путь к .NET, посвященной, технологии .NET.

Сразу хочу попросить прощения перед теми читателями, кто читает этот выпуск с разрешением 800x600. Просто пример кода использования шаблонов в DataGrid достаточно большой. Я долго колебался, что выбрать: читаемость примера или возможность его полного размещения на экране монитора с разрешением 800x600. В итоге выбрал читаемость.

Что будет в рассылке

Свои мысли, замечания и идеи по поводу рассылки вы можете присылать на мой ящик: daoto@daoto.net.

Мысли вслух

1. Кеширование aspx-страниц (ASP.NET).

Для управления кешированием страниц в ASP.NET-приложении преднизначен класс HttpCachePolicy. Получить ссылку на объект этого класса можно с помощью свойства Cache. Второй способ - это использование директивы OutputCache aspx-страницы. Например, зададим время кеширование страницы - 2 минуты.

<%@ OutputCache Duration="120" VaryByParam="none" %>
<html>
<!-- ... код страницы ... -->
</html>

Время хеширования определяется с помощью атрибута Duration. Его использование является обязательным. Эта страница будет кешироваться 2 минуты на сервере и на клиенте. Место кеширования страницы определяется с помощью атрибута Location. По умолчанию, его значение - "Any", что означает, что страница будет кешироваться, где только возможно. Все возможные значения параметра Location приведены в таблице:

Значение Описание
Any Страница будет кешироваться везде где это возможно - в браузере клиента, на прокси-сервере, или любом другом сервере, отправляющем запрос, на web-сервере, обрабатывающем запрос
Client Страница будет кешироваться только в браузере клиента
Downstream Страница будет кешироваться на сервере, отправляющем запрос (прокси-сервер и т.д.)
None Страница не будет кешироваться
Server Страница будет кешироваться на web-сервере, обрабатывающем запрос.

Для современного интернета является стандартной ситуация, когда содержание страницы меняется в зависимости от передаваемых ей параметров методами POST или GET. Атрибут VaryByParam позволяет сохранять в кеше страницы в зависимости от передаваемых ей параметров. В следующем примере на сервере будут кешироваться все варианты страницы в зависимости от передаваемых значений параметра sql:

<%@ OuputCache Duration="120" Location="Server" VaryByParam = "sql"%>

(И опять насчет обязательных парамеров - попробуйте опустить атрибут VaryByParam - узнаете, что он тоже обязательный). Для указания нескольких параметров их можно разделить точкой с запятой (;). Либо можно задать кеширование страницы в зависимости от значений всех передаваемых параметров, использовав сисмвол "*":

<!-- Кеширование в зависимости от значений параметров id и sql -->
<%@ OuputCache Duration="120" Location="Server" VaryByParam = "sql;id"%>
<!-- Кеширование в зависимости от значений всех параметров -->
<%@ OuputCache Duration="120" Location="Server" VaryByParam = "*"%>

Кроме этих атрибутов существуют еще атрибуты - VaryByHeader - позволяющие кешировать в зависимости от значений HTTP - заголовка и VaryByCustom - позволяющие кешировать страницы в зависимости от параметров, определенных разработчиками.

2. Использование шаблонов редактирования в серверном элементе управления DataGrid (ASP.NET + ADO.NET).

Во втором выпуске рассылки мы начали рассмотрение использования шаблонов в серверном элементе управления DataGrid. Тогда мы их использовали для просмотра табличных данных. Сейчас мы рассмотрим их применение для редактирования табличных данных.

Для полного понимания рекомендую прочитать

Итак, предпологая, что вы читали второй выпуск рассылки (Использование шаблонов в серверном элементе управления DataGrid для отображения данных"), если нет, то вы можете это сделать сейчас, приступим к продолжению рассмотрения шаблонов в серверном элементе управления DataGrid.

Для задания шаблонов редактирования мы будем использовать атрибут <EditItemTemplate></EditItemTemplate>. Кроме того, для создания столбцов с кнопками редактирования (Edit, Update, Cancel, Delete) мы будем использовать элементы управлению <asp:CommandColumn/> и <asp:EditCommandColumn>.

<asp:datagrid id="dataGrid" runat="server" AutoGenerateColumns="False">
 <Columns>
  <asp:BoundColumn 
   Visible="False" 
   DataField="id_author" 
   ReadOnly="True">
  </asp:BoundColumn>
  <asp:TemplateColumn HeaderText="Авторы">
   <ItemTemplate>
    <a href='mailto:<%# DataBinder.Eval(Container.DataItem, "email")%>'>
     <%# DataBinder.Eval(Container.DataItem, "id_author")%></a>   
    <a href='<%# DataBinder.Eval(Container.DataItem, "page")%>'>
     http://<%# DataBinder.Eval(Container.DataItem, "page")%></a>
    <%# DataBinder.Eval(Container.DataItem, "icq", "ICQ: {0}")%>
    <br>
    <b>
     <%# DataBinder.Eval(Container.DataItem, "name")%>
     <%# DataBinder.Eval(Container.DataItem, "fatherName")%>
     <%# DataBinder.Eval(Container.DataItem, "surname")%>
    </b>
    <br>
    <i>
     <%# DataBinder.Eval(Container.DataItem, "description")%>
    </i>
   </ItemTemplate>


<!-- шаблон редактирования --> <EditItemTemplate> <table width="100%" border="0" ID="Table1"> <tr> <td width="80">Ник</td> <td> <asp:TextBox id="textId_author" runat="server" MaxLength="20" text='<%# DataBinder.Eval(Container.DataItem, "id_author")%>' ReadOnly="true"> </asp:TextBox> </td> </tr> <tr> <td>E-mail</td> <td> <asp:TextBox id="textEmail" runat="server" MaxLength="50" Text='<%# DataBinder.Eval(Container.DataItem, "email")%>'> </asp:TextBox></td> </tr> <tr> <td>http://</td> <td> <asp:TextBox id="textPage" runat="server" text='<%# DataBinder.Eval(Container.DataItem, "page")%>'> </asp:TextBox></td> </tr> <tr> <td>Имя</td> <td> <asp:TextBox id="textName" runat="server" MaxLength="50" Text='<%# DataBinder.Eval(Container.DataItem, "name")%>'> </asp:TextBox></td> </tr> <tr> <td>Фамилия</td> <td> <asp:TextBox id="textSurname" runat="server" MaxLength="50" text='<%# DataBinder.Eval(Container.DataItem, "surname")%>'> </asp:TextBox></td> </tr> <tr> <td>Отчество</td> <td> <asp:TextBox id="textFatherName" runat="server" MaxLength="50" Text='<%# DataBinder.Eval(Container.DataItem, "fatherName")%>'> </asp:TextBox></td> </tr> <tr> <td>ICQ</td> <td> <asp:TextBox id="textIcq" runat="server" text='<%# DataBinder.Eval(Container.DataItem, "icq")%>'> </asp:TextBox></td> </tr> </table> <asp:TextBox id="textDescription" Runat="server" MaxLength="600" Width="500px" Rows="5" TextMode="MultiLine" text='<%# DataBinder.Eval(Container.DataItem, "description")%>'> </asp:TextBox> <BR> </EditItemTemplate> </asp:TemplateColumn>

<!-- Столбцы с кнопками --> <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" CancelText="Cancel" EditText="Edit"> </asp:EditCommandColumn> <asp:ButtonColumn Text="Delete" CommandName="Delete"> </asp:ButtonColumn> </Columns> </asp:datagrid>

Столбцы с кнопками можно добавить дибо вручную, либо в VS .NET с помощью диалогового окна Property Builder элемента управления DataGrid (правой кнопкой мыши по DataGrid в дизайнере и выбрать соответствующий пункт контекстного меню).

Следующее замечание касается

<asp:BoundColumn Visible="False" DataField="id_author" ReadOnly="True"> 
</asp:BoundColumn>  

В этом невидимом столбце хранятся значения ключевого поля id_author. Это необходимо при определении ключа удаляемой строки. Честно говоря, я как-то уже не помню, почему стал применять это скрытое поле - то-ли прочитал где-то, то-ли горький опыт.

Следующее что необходимо сделать - это добавить обработчики событий серверного элемента управления DataGrid - EditCommand, UpdateCommand, CancelCommand, DeleteCommand. Это можно сделать с помощью окна Properties, на закладке с молнией, где определяются обработчики событий.

А вот и сам код обработчиков:

/// <summary>
/// Обновление данных страницы
/// </summary>
protected void UpdateData()
{
 conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
 comm = new SqlCommand();
 comm.Connection = conn;
 comm.CommandText = "SELECT * FROM Authors";
 try
 {
  conn.Open();
  dataGrid.DataSource = comm.ExecuteReader();
  this.DataBind();
 }
 catch(Exception ex)
 {
  lbMessage.Text = ex.Message;
 }
 finally
 {
  conn.Close();
 }
}
/// <summary>
/// Редактирование данных автора
/// </summary>
private void dataGrid_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//устанавливаем выбранную строку
//в режим редактирования dataGrid.EditItemIndex = e.Item.ItemIndex; this.UpdateData(); } /// <summary> /// Удаление данных автора /// </summary> private void dataGrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]); comm = new SqlCommand("sp_DaoSql_DeleteAuthors", conn); comm.CommandType = CommandType.StoredProcedure; comm.Parameters.Add("@id_author", SqlDbType.VarChar, 20); comm.Parameters["@id_author"].Value = e.Item.Cells[0].Text; try { conn.Open(); comm.ExecuteNonQuery(); } catch(Exception ex) { lbMessage.Text = ex.Message; } finally { conn.Close(); } this.UpdateData(); }
/// <summary>
/// Отмена редактирования данных автора
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void dataGrid_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//устанавливаем, что в режиме редактирования
//не находится никакая из строк dataGrid.EditItemIndex = -1; this.UpdateData(); }
/// <summary>
/// Внесение изменений в данные автора
/// </summary>
private void dataGrid_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
 string id_author = ((TextBox)e.Item.Cells[1].FindControl("textId_author")).Text;
 string name = ((TextBox)e.Item.Cells[1].FindControl("textName")).Text;
 string surname = ((TextBox)e.Item.Cells[1].FindControl("textSurname")).Text;
 string fatherName = ((TextBox)e.Item.Cells[1].FindControl("textFatherName")).Text;
 string email = ((TextBox)e.Item.Cells[1].FindControl("textEmail")).Text;
 string page = ((TextBox)e.Item.Cells[1].FindControl("textPage")).Text;
 string icq = ((TextBox)e.Item.Cells[1].FindControl("textIcq")).Text;
 string description = ((TextBox)e.Item.Cells[1].FindControl("textDescription")).Text;
 
 conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
 comm = new SqlCommand("sp_DaoSql_UpdateAuthors", conn);
 comm.CommandType = CommandType.StoredProcedure;

 //параметры
 //@id_author
 comm.Parameters.Add("@id_author", SqlDbType.VarChar, 20);
 comm.Parameters["@id_author"].Value = id_author;

 //@email
 comm.Parameters.Add("@email", SqlDbType.VarChar, 50);
 comm.Parameters["@email"].Value = email;

 //@page
 comm.Parameters.Add("@page", SqlDbType.VarChar, 50);
 comm.Parameters["@page"].Value = page;

 //@name
 comm.Parameters.Add("@name", SqlDbType.VarChar, 50);
 comm.Parameters["@name"].Value = name;

 //@surname
 comm.Parameters.Add("@surname", SqlDbType.VarChar, 50);
 comm.Parameters["@surname"].Value = surname;

 //@fatherName
 comm.Parameters.Add("@fatherName", SqlDbType.VarChar, 50);
 comm.Parameters["@fatherName"].Value = fatherName;

 //@icq
 comm.Parameters.Add("@icq", SqlDbType.VarChar, 50);
 comm.Parameters["@icq"].Value = txtIcq.Text;

 //@description
 comm.Parameters.Add("@description", SqlDbType.VarChar, 500);
 comm.Parameters["@description"].Value = description;

 try
 {
  conn.Open();
  comm.ExecuteNonQuery();
  dataGrid.EditItemIndex = -1;
 }
 catch(Exception ex)
 {
  lbMessage.Text = ex.Message;
 }
 finally
 {
  conn.Close();
 }

 this.UpdateData();
}

Код достаточно очевиден. Единственное, что отмечу - это dataGrid.EditItemIndex - устанавливает индекс строки dataGrid, находящейся в режиме редактирования. Если присвоить -1, то никакая строка не будет находиться в режиме редактирования.

Приведу еще код хранимых процедур, используемых в этом примере:

--Обновить данные автора
CREATE PROC sp_DaoSql_UpdateAuthors
 @id_author varchar(20),
 @email varchar(50),
 @page varchar(50),
 @name varchar(50),
 @surname varchar(50),
 @fatherName varchar(50),
 @icq int,
 @description varchar(500)
AS
UPDATE Authors
SET email = @email,
 page = @page,
 [name] = @name,
 surname = @surname,
 fatherName = @fatherName,
 icq = @icq,
 [description] = @description
WHERE id_author = @id_author

--удаление данных автора
CREATE PROC sp_DaoSql_DeleteAuthors
 @id_author varchar(20)
AS
DELETE Authors
WHERE id_author = @id_author

.

3. Пример создания статистики сайта (ASP.NET + ADO.NET).

Итак перед нами стоит небольшая задача - создать собственную статистику сайта. Информация, которую нам необходимо собрать стандартна для статистик сайта:

  • Время визита
  • Адрес посетителя
  • Запрашиваемая страница
  • Параметры запроса
  • Метод запроса (GET, POST)
  • Предыдущий адрес (откуда пришел)
  • Браузер посетителя

Создадим сначала таблицу в которой будут храниться все эти данные:

CREATE TABLE DailyStat
(
 id_stat int identity(1,1) PRIMARY KEY,
 VisitTime DateTime,
 UserHostAddress varchar(15),
 FilePath varchar(150),
 QueryString varchar(30),
 RequestType varchar(4),
 UrlReferrer varchar(1000),
 UserAgent varchar(250)
)

Затем необходимо создать хранимую процедуру добавления данных статистики:

CREATE PROC sp_InsertStat
 @UserHostAddress varchar(15),
 @FilePath varchar(150),
 @QueryString varchar(30),
 @RequestType varchar(4),
 @UrlReferrer varchar(1000),
 @UserAgent varchar(250)
AS
INSERT DailyStat(VisitTime,
 UserHostAddress,
 FilePath,
 QueryString,
 RequestType,
 UrlReferrer,
 UserAgent)
VALUES( GetDate(),
 @UserHostAddress,
 @FilePath,
 @QueryString,
 @RequestType,
 @UrlReferrer,
 @UserAgent)

Вместо того, чтобы вставлять код учета посещаемости сайта в код каждой страницы воспользуемся методом Application_BeginRequest() (Global.asax.cs). Код этогом метода будет выполняться в начале каждого запроса (событие Начало зарооса). Необходимы данные будем получать из объекта Request (запрос):

protected void Application_BeginRequest(Object sender, EventArgs e)
{
 if(Request.QueryString["id"]!=null)
  return;
 SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
 SqlCommand comm = new SqlCommand("sp_InsertStat", conn);
 comm.CommandType = CommandType.StoredProcedure;
 
 //IP - пользователя
 comm.Parameters.Add("@UserHostAddress", SqlDbType.VarChar, 15);
 comm.Parameters["@UserHostAddress"].Value = Request.UserHostAddress;
 
 //Запрошенный файл
 comm.Parameters.Add("@FilePath", SqlDbType.VarChar, 150);
 comm.Parameters["@FilePath"].Value = Request.FilePath;
 
 //Параметры запроса
 comm.Parameters.Add("@QueryString", SqlDbType.VarChar, 30);
 comm.Parameters["@QueryString"].Value = Request.QueryString.ToString();
 
 //Метод
 comm.Parameters.Add("@RequestType", SqlDbType.VarChar, 4);
 comm.Parameters["@RequestType"].Value = Request.RequestType;
 
 //Откуда пришли
 comm.Parameters.Add("@UrlReferrer", SqlDbType.VarChar, 1000);
 string refer = Request.UrlReferrer == null? "": Request.UrlReferrer.ToString();
 comm.Parameters["@UrlReferrer"].Value = refer;
 
 //Браузер
 comm.Parameters.Add("@UserAgent", SqlDbType.VarChar, 250);
 comm.Parameters["@UserAgent"].Value = Request.UserAgent;
 
 try
 {
  conn.Open();
  comm.ExecuteNonQuery();
 }
 finally
 {
  conn.Close();
 }
}

Последние статьи

ADO.NET. Работа с данными в ADO.NET - II

В этой статье рассмотрены классы пространства имен System.Data - DataColumn, DataRow, DataTable, DataSet - предназначенные для работы с отсоедененными данными. Во второй части мы рассмотрим работу со строками DataRow. Создание, изменение и удаление строк. Выборка строк по из таблицы DataTable по каким-либо параметрам.

ADO.NET. Работа с данными в ADO.NET - III

В этой статье рассмотрены классы пространства имен System.Data - DataColumn, DataRow, DataTable, DataSet - предназначенные для работы с отсоедененными данными. Во второй части мы рассмотрим работу со строками DataRow. Создание, изменение и удаление строк. Выборка строк по из таблицы DataTable по каким-либо параметрам.

Архив рассылки. Выпуск второй.

1. Использование шаблонов в серверном элементе управления DataGrid для отображения данных (ASP.NET). 2. Выполнение запросов DataAdapter в контексте транзакции (ADO.NET). 3. Хранение строк подключения в приложениях ASP.NET.


PARKING.RU
Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows(r): поддержка .NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты.
http://www.parking.ru/hosting.asp


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное