| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Статьи:: .NET Framework :: Учебник по ASP.NET :: ASP.NET 2.0. Обзор новых сервисов, элементов управления и средств
ASP.NET 2.0. Обзор новых сервисов, элементов управления и средств
Исходные коды статьи (0,12 МБ), © Microsoft.com Автор:
Спустя четыре года после своего выхода ASP.NET стала «золотым стандартом» для
Эта статья написана на основе предварительной версии ASP.NET 2.0 Community Technology Preview, вышедшей в марте 2004 г. Любая содержащаяся здесь информация может быть изменена.Community Technology Preview, вышедшей в марте 2004 г. Любая содержащаяся здесь информация может быть изменена. В статье используются следующие технологии: ASP.NET 1.x и C#. В статье рассматриваются:
Master PagesОдин из самых бросающихся в глаза недостатков ASP.NET 1.x — отсутствие поддержки шаблонов страниц. Нельзя определить «эталонную страницу» (master page), от которой наследуют другие страницы. Разработчики решают эту проблему, создавая страницы с помощью пользовательских элементов управления, которые легко воспроизводить на разных страницах. В ASP.NET 2.0 больше не нужно прибегать к таким приемам, поскольку появилось новое средство — Master Pages. Чтобы описать, что такое Master Pages, подойдет термин «визуальное наследование». Сначала вы определяете эталонную страницу, содержащую то, что должно присутствовать на других страницах, и с помощью элементов управления ContentPlaceHolder задаете места, в которые дочерние страницы (subpages) могут помещать свое содержимое. Затем разрабатываете дочерние страницы — ASPX-файлы, ссылающиеся на эталонную страницу через директивы вида: <%@ Page MasterPageFile="~/Foo.master" %> В дочерних страницах с помощью элементов управления Content вы заполняете поля подстановки эталонной страницы. Открыв дочернюю страницу в браузере, вы увидите объединенное содержимое эталонной и дочерней страниц. В приложении в листингах и эталонная страница используется, чтобы определить заголовок и колонтитул, показываемые на каждой странице. Дочерняя страница вставляет содержимое между заголовком и колонтитулом, добавляя элемент Content, ссылающийся на ContentPlaceHolder эталонной страницы. Обратите внимание на совпадение ID и ContentPlaceHolderID и на директиву @ Master в эталонной странице. Листинг 1. Master Pages. Файл Master.master<%@ Master %>
<html>
<body leftmargin="0" topmargin="0" rightmargin="0"
bottommargin="0" marginheight="0" marginwidth="0">
<!-- Баннер -->
<table cellspacing="0" cellpadding="0"
style="background-image: url('/images/stripes.gif');
background-repeat: repeat-x, repeat-y" width="100%">
<tr><td align="center">
<span style="font-family: verdana; font-size: 36pt;
font-weight: bold; color: white">Master Pages</span><br>
<span style="font-family: verdana; font-size: 10pt;
font-weight: normal; color: white">Баннер определен
в Master.master</span>
</td></tr>
</table>
<!-- Поле подстановки для контента,
помещаемого между баннером и колонтитулом -->
<asp:ContentPlaceHolder ID="Main" RunAt="server" />
</form>
<!-- Колонтитул -->
<table width="100%"><tr><td align="center">
<span style="font-family: verdana; font-size: 8pt; color: red">
Copyright (c) 2004 by Me Inc. Все права защищены<br>
Колонтитул определен в Master.master
</span>
</td></tr></table>
</body>
</html>Листинг 2. Master Pages. Файл Subpage.aspx<%@ Page MasterPageFile="~/Master.master" %>
<asp:Content ContentPlaceHolderID="Main" RunAt="server">
<table width="100%" height="256px"><tr><td align="center">
<h2>Содержимое определено в Subpage.aspx</h2>
</td></tr></table>
</asp:Content>Master Pages полностью поддерживается объектной моделью ASP.NET. В класс System.Web.UI.Page добавлено свойство Master, позволяющее дочерним страницам программно обращаться к своим эталонным страницам и определенным в них элементам управления. Допускается вложение эталонных страниц и включение в них контента по умолчанию, который могут переопределять дочерние страницы: <asp:ContentPlaceHolder ID="Main" RunAt="server">
Контент по умолчанию, показываемый в дочерних страницах,
если он не переопределяется явным образом
</asp:ContentPlaceHolder>Кроме того, в файле Web.config можно задать эталонную страницу, по умолчанию используемую приложением: <configuration>
<system.web>
<pages masterPageFile="~/Foo.master" />
</system.web>
</configuraion>Разработчики дочерних страниц могут переопределять контент, используемый по умолчанию, и создавать собственные эталонные страницы. Изюминка Master Pages в том, что эта технология поддерживается Visual Studio 2005. При загрузке дочерней страницы IDE показывает содержимое, заданное в эталонной странице, блеклым цветом и не разрешает его изменять, а содержимое, заданное в дочерней странице, отображает обычными цветами и разрешает редактировать. Благодаря этому легко понять, где определено содержимое, и, если требуется отредактировать содержимое, относящееся к эталонной странице, вы просто открываете в IDE шаблон страницы. Более полное описание Master Pages можно найти в статье Фрица Аньена (Fritz Onion), опубликованной в этом номере «MSDN Magazine». Элементы управления — источники данныхСвязывание с данными — замечательная возможность ASP.NET 1.x.
Несколько строк кода для связывания с данными, помещенные в нужное место,
заменяют массу Следующая страница DataSource1.aspx, используя связывание с данными в ASP.NET 2.0, показывает выборку из базы данных Pubs (SQL Server): <html>
<body>
<form runat="server">
<asp:SqlDataSource ID="Titles" RunAt="server"
ConnectionString="server=localhost;database=pubs;Integrated
Security=SSPI"
SelectCommand="select title_id, title, price from titles" />
<asp:DataGrid DataSourceID="Titles" RunAt="server" />
</form>
</body>
</html>Элемент SqlDataSource определяет источник данных и выполняемый к нему запрос, а свойство DataSourceID элемента DataGrid ссылается на этот SqlDataSource. При загрузке страницы SqlDataSource выполняет запрос, результаты которого показываются в DataGrid. Конечно, на практике связывание с данными редко бывает настолько простым. Допустим, вам нужно кэшировать результаты запроса или выполнять запросы к базам данных, указывая параметры, выбираемые в других элементах управления. Страница в листинге 3 использует один SqlDataSource, чтобы заполнить раскрывающийся список названиями стран из таблицы Customers базы данных Northwind, и другой — чтобы заполнить DataGrid перечнем клиентов из страны, выбранной в списке. Заметьте: элемент <SelectParameters> указывает, что SqlDataSource элемента управления DataGrid берет значение @country из раскрывающегося списка. Также обратите внимание на атрибуты EnableCaching и CacheDuration элемента SqlDataSource, связанного с выпадающим списком. Эти атрибуты указывают, что результаты запроса SELECT DISTINCT кэшируются в течение 60 секунд.
Листинг 3. DataSource2.aspx<html>
<body>
<form runat="server">
<asp:SqlDataSource ID="Countries" RunAt="server"
ConnectionString="server=localhost;database=northwind;
Integrated Security=SSPI"
SelectCommand="select distinct country from customers order by
country"
EnableCaching="true" CacheDuration="60" />
<asp:SqlDataSource ID="Customers" RunAt="server"
ConnectionString="server=localhost;database=northwind;
Integrated Security=SSPI"
SelectCommand="select * from customers
where country=@country">
<SelectParameters>
<asp:ControlParameter Name="Country"
ControlID="MyDropDownList"
PropertyName="SelectedValue" />
</SelectParameters>
</asp:SqlDataSource>
<asp:DropDownList ID="MyDropDownList" DataSourceID="Countries"
DataTextField="country" AutoPostBack="true" RunAt="server" />
<asp:DataGrid DataSourceID="Customers" RunAt="server" />
</form>
</body>
</html>Эти примеры — лишь малая часть возможностей, предоставляемых элементами источников данных. Например, можно вызывать хранимые процедуры, указывать в качестве параметров запросов значения, получаемые из строк запросов, ввода пользователя, состояния сеанса или cookie, а также задавать, что должен использовать элемент — DataSet или DataReader. Поскольку элементы источников данных обладают функциональностью адаптеров данных, с их помощью можно даже обновлять базы данных. Думаю, к моменту финального выпуска ASP.NET 2.0 появится много материалов, посвященных элементам источников данных. Дино Эспозито (Dino Esposito) рассматривает их значительно детальнее, чем я; см. рубрику «На переднем крае» в этом номере «MSDN Magazine». Прежде чем закончить с темой связывания с данными, замечу, что ASP.NET 2.0 поддерживает упрощенный синтаксис связывания с данными. Разработчикам для ASP.NET приходится писать громоздкие выражения вида: <%# DataBinder.Eval (Container.DataItem, "title") %>
В ASP.NET 2.0 это выражение можно заменить на:
<%# Eval("title") %>Помимо оператора Eval ASP.NET 2.0 поддерживает операторы XPath
и XPathSelect, которые через XPath-выражения определяют местонахождение данных
в Чтобы увидеть, как работают темы и скины, добавьте в код DataSource2.aspx, показанный в листинге 3, сстроку: <%@ Page Theme="BasicBlue" %> Затем обновите страницу. Вы получите результат, как на рис. 1.
Теперь придадим странице совершенно другой вид. Добавим элемент и изменим директиву @ Page, указав другую тему: <%@ Page Theme="SmokeAndGlass" %> Новый атрибут Theme директивы @ Page объявляет, что к странице применяется заданная тема. Кроме того, темы можно применять программно через свойство Theme класса Page. Тема (theme) — это набор скинов, а скин (skin) — набор визуальных атрибутов, применяемых к типу элемента управления. BasicBlue и SmokeAndGlass — предопределенные, или глобальные, темы в ASP.NET 2.0. Их файлы содержатся в подкаталогах каталога Microsoft.NETFramework…ASP.NETClientFilesThemes. Вы можете определить собственные темы и скины и развернуть их в подкаталогах каталога Themes вашего приложения. Каждый подкаталог содержит файлы определенной темы, причем имя темы совпадает с именем подкаталога. Подкаталог с темой содержит один или несколько .skin-файлов и другие ресурсы, используемые темой, например, файлы изображений и таблицы стилей. Определения скинов содержатся в .skin-файлах и во многом аналогичны тэгам, применяемым для объявления экземпляров элементов управления в ASPX-файлах. Чтобы посмотреть, как это работает, создайте подкаталог Themes в папке, где находится DataSource2.aspx. В каталоге Themes создайте подкаталог ShockingPink. В каталоге ShockingPink создайте .skin-файл и поместите в него следующий фрагмент: <asp:DropDownList runat="server" BackColor="hotpink" ForeColor="white" /> <asp:DataGrid runat="server" BackColor="#CCCCCC" BorderWidth="2pt" BorderStyle="Solid" BorderColor="#CCCCCC" GridLines="Vertical" HorizontalAlign="Left"> <HeaderStyle ForeColor="white" BackColor="hotpink" /> <ItemStyle ForeColor="black" BackColor="white" /> <AlternatingItemStyle BackColor="pink" ForeColor="black" /> </asp:DataGrid> Затем измените директиву @ Page в файле DataSource2.aspx: <%@ Page Theme="ShockingPink" %> В результате получится, несомненно, одна из самых кричащих
ShockingPink.skin задает внешний вид по умолчанию для элементов управления DropDownList и DataGrid. Имена .skin-файлов не обязательно должны совпадать с именами тем, к которым они относятся, хотя часто совпадают. Тема может содержать несколько .skin-файлов, а один .skin-файл может определять атрибуты для любого количества типов элементов управления. Кроме того, в ASP.NET бывают скины по умолчанию и не по умолчанию. Скин без атрибута SkinID по определению является скином по умолчанию. Скины не по умолчанию содержат атрибут SkinID, на который можно ссылаться, указывая SkinID в тэгах элементов управления. Новые элементы управленияВ ASP.NET 2.0 появится около 50 новых типов элементов управления,
позволяющих разрабатывать богатый UI, не вникая в тонкости HTML, клиентских
сценариев и Элемент управления DynamicImage упрощает вывод
на Листинг 4. DynamicImage.aspx<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>
<%@ Import Namespace="System.IO" %>
<html>
<body>
<asp:DynamicImage ID="PieChart" DynamicImageType="ImageBytes"
RunAt="server" />
</body>
</html>
<script language="C#" runat="server">
void Page_Load (Object sender, EventArgs e)
{
// Создаем битовую карту и рисуем круговую диаграмму
Bitmap bitmap = new Bitmap (240, 180, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage (bitmap);
DrawPieChart (g, Color.White, new decimal[]
{ 100.0m, 200.0m, 300.0m, 400.0m }, 240, 180);
g.Dispose();
// Присоединяем изображение к элементу DynamicImage
MemoryStream stream = new MemoryStream ();
bitmap.Save (stream, ImageFormat.Gif);
bitmap.Dispose();
PieChart.ImageBytes = stream.ToArray ();
}
void DrawPieChart (Graphics g, Color bkgnd, decimal[] vals,
int width, int height)
{
// Очищаем фон
SolidBrush br = new SolidBrush (bkgnd);
g.FillRectangle (br, 0, 0, width, height);
br.Dispose ();
// Создаем массив кистей
SolidBrush[] brushes = new SolidBrush[6];
brushes[0] = new SolidBrush (Color.Red);
brushes[1] = new SolidBrush (Color.Yellow);
brushes[2] = new SolidBrush (Color.Blue);
brushes[3] = new SolidBrush (Color.Cyan);
brushes[4] = new SolidBrush (Color.Magenta);
brushes[5] = new SolidBrush (Color.Green);
// Суммируем входные значения
decimal total = 0.0m;
foreach (decimal val in vals)
total += val;
// Рисуем диаграмму
float start = 0.0f;
float end = 0.0f;
decimal current = 0.0m;
for (int i=0; i<vals.Length; i++) {
current += vals[i];
start = end;
end = (float) (current / total) * 360.0f;
g.FillPie (brushes[i % 6], 0.0f, 0.0f, width, height,
start, end - start);
}
// Очищаем ресурсы и выходим
foreach (SolidBrush brush in brushes)
brush.Dispose ();
}
</script>Элемент управления DynamicImage использует новый сервис ASP.NET
2.0 — сервис генерации изображений. Этот сервис можно применять и при
динамическом формировании изображений в ASIX-файлах (еще одно новшество ASP.NET
2.0). В примерах к этой статье (доступных на сайте MSDN Magazine) имеется файл
DynamicImage.asix, демонстрирующий основы ASIX-файлов. Чтобы его запустить,
скопируйте DynamicImage.asix в виртуальный каталог вашего
Еще один интересный и потенциально очень полезный элемент управления, дебютирующий в ASP.NET 2.0, — MultiView. Элемент управления MultiView, используемый совместно с элементами управления View, служит для создания страниц с несколькими логическими представлениями. В любой момент показывается только одно представление (с индексом, равным значению свойства ActiveViewIndex элемента MultiView). Вы можете переходить от одного представления к другому, изменяя индекс активного представления. Элементы MultiView идеально подходят для страниц, где есть ярлычки или другие элементы управления, позволяющие выбирать текущую логическую страницу. В странице в листинге 5 элемент MultiView используется, чтобы показать два разных представления таблицы Titles базы данных Pubs: одно выводится с помощью GridView, другое — с помощью DetailsView. Переключение между представлениями выполняется выбором элемента из раскрывающегося списка. Заметьте: атрибут AllowPaging тэга <asp:DetailsView> позволяет просматривать записи в DetailsView. Листинг 5. MultiView.aspx<%@ Page Theme="BasicBlue" %>
<html>
<body>
<form runat="server">
<asp:SqlDataSource ID="Titles" RunAt="server"
ConnectionString="server=localhost;database=pubs; Integrated
Security=SSPI"
SelectCommand="select title_id, title, price from titles" />
<asp:DropDownList ID="ViewType" AutoPostBack="true"
OnSelectedIndexChanged="OnSwitchView" RunAt="server">
<asp:ListItem Text="GridView" Selected="true" RunAt="server" />
<asp:ListItem Text="DetailsView" RunAt="server" />
</asp:DropDownList>
<asp:MultiView ID="Main" ActiveViewIndex="0" RunAt="server">
<asp:View RunAt="server">
<asp:GridView DataSourceID="Titles" RunAt="server" />
</asp:View>
<asp:View RunAt="server">
<asp:DetailsView DataSourceID="Titles" AllowPaging="true"
RunAt="server" />
</asp:View>
</asp:MultiView>
</form>
</body>
</html>
<script language="C#" runat="server">
void Page_Load (Object sender, EventArgs e)
{
if (IsPostBack)
DataBind ();
}
void OnSwitchView (Object sender, EventArgs e)
{
Main.ActiveViewIndex = ViewType.SelectedIndex;
}
</script>Элементы управления GridView и DetailsViewDataGrid — один из самых популярных элементов управления в ASP.NET, но в некоторых отношениях он — жертва собственного успеха: у него настолько богатая функциональность, что разработчики для ASP.NET хотят еще большего. DataGrid в ASP.NET 2.0 изменился незначительно, зато появилось два новых элемента — GridView и DetailsView, предоставляющие возможности, которых часто требовали от DataGrid. GridView, как и DataGrid, визуализирует HTML-таблицы, но в отличие от DataGrid может самостоятельно выполнять разбиение на страницы и сортировку. Кроме того, GridView поддерживает больше типов столбцов (типов полей в терминах GridView), чем DataGrid, и более интеллектуально ведет себя при рендеринге, например автоматически отображает логические значения флажками. Не составляет труда объединить GridView с DetailsView, чтобы создать представление «родитель-потомок». Основной недостаток GridView в том, что он, как и DataGrid, выполняет большую часть операций, возвращая форму на сервер. В листинге 6 показано, как с помощью GridView и DetailsView создать простое представление «родитель-потомок» (master-detail view) таблицы Titles базы данных Pubs. Элементы SqlDataSource предоставляют данные, отображаемые этими элементами управления. SelectParameter элемента SqlDataSource связан с элементом GridView, что позволяет вывести в DetailsView запись, выбранную в GridView. Для выбора записи нужно щелкнуть одну из кнопок Select в элементе GridView. Чтобы такие кнопки появились, в тэг <asp:GridView> помещен атрибут AutoGenerateSelectButton="true». Листинг 6. MasterDetail.aspx<%@ Page Theme="BasicBlue" %>
<html>
<body>
<form runat="server">
<asp:SqlDataSource ID="Titles1" RunAt="server"
ConnectionString="server=localhost;database=pubs;Integrated
Security=SSPI"
SelectCommand="select title_id, title, price from titles" />
<asp:SqlDataSource ID="Titles2" RunAt="server"
ConnectionString="server=localhost;database=pubs;Integrated
Security=SSPI"
SelectCommand="select title_id, title, price from titles where
title_id=@title_id">
<SelectParameters>
<asp:ControlParameter Name="title_id" ControlID="MyGridView"
PropertyName="SelectedValue" />
</SelectParameters>
</asp:SqlDataSource>
<table><tr><td>
<asp:GridView ID="MyGridView" DataSourceID="Titles1"
Width="100%" RunAt="server" AutoGenerateColumns="false"
SelectedIndex="0" AutoGenerateSelectButton="true"
DataKeyNames="title_id">
<Columns>
<asp:BoundField HeaderText="Title ID"
DataField="title_id" />
<asp:BoundField HeaderText="Book Title"
DataField="title" />
<asp:BoundField HeaderText="Price" DataField="price"
DataFormatString="{0:c}" NullDisplayText="TBD" />
</Columns>
</asp:GridView>
</td></tr>
<tr><td>
<asp:DetailsView DataSourceID="Titles2" RunAt="server"
AutoGenerateRows="false" Width="100%">
<Fields>
<asp:BoundField HeaderText="Title ID"
DataField="title_id" />
<asp:BoundField HeaderText="Book Title"
DataField="title" />
<asp:BoundField HeaderText="Price" DataField="price"
DataFormatString="{0:c}" NullDisplayText="TBD" />
</Fields>
</asp:DetailsView>
</td></tr></table>
</form>
</body>
</html>Заметьте, что элементы <Columns> и <Fields> определяют типы полей элементов управления GridView и DetailsView. Они почти эквивалентны элементам <Columns> в элементах управления DataGrid. Поддерживаемые типы полей перечислены в табл. Особый интерес представляют типы ImageField и DropDownListField, избавляющие разработчиков от необходимости вручную писать код, который выводит в элементах управления DataGrid изображения и раскрывающиеся списки.
Новшества в области администрированияЕще один ощутимый недостаток ASP.NET, исправленный
в ASP.NET 2.0, — полное отсутствие декларативных или программных интерфейсов,
предназначенных для администрирования На момент написания статьи разработка Webadmin.axd еще
не закончена. Он будет служить для конфигурирования различных сервисов, входящих
в ASP.NET 2.0 (например сервисов управления членством и ролями), просмотра
статистики Сервис управления членствомОдно из лучших новых средств ASP.NET 2.0 — сервис управления
членством (membership service), предоставляющий удобный API для создания учетных
записей пользователей и управления ими. С появлением ASP.NET 1.x началось
массовое применение аутентификации на основе форм, но, чтобы применять такую
аутентификацию на практике, Для работы с Membership API служат два новых класса: Membership и MembershipUser. Первый содержит статические методы для создания пользователей, их проверки и др. MembershipUser представляет отдельных пользователей и содержит методы и свойства для считывания и смены паролей, получения даты последнего входа и т. д. Например, следующий оператор принимает имя и пароль пользователя и возвращает true или false в зависимости от того, допустим ли этот пользователь. Такие операторы заменят вызовы использовавшихся в приложениях ASP.NET 1.x самодельных методов, которые проверяли удостоверения защиты через Active Directory или серверные базы данных: bool isValid = Membership.ValidateUser (username, password); Следующий оператор возвращает объект MembershipUser, представляющий пользователя с именем jeffpro: MembershipUser user = Membership.GetUser ("jeffpro");Наконец, следующий оператор считывает адрес электронной почты зарегистрированного пользователя (предполагается, что этот адрес был сохранен): string email = user.Email; Где хранятся имена пользователей, пароли и другие данные,
c которыми работает сервис управления членством? Как и почти все сервисы ASP.NET
2.0, управляющие состоянием, этот сервис основан на провайдерах. Провайдеры —
модули, позволяющие сервисам взаимодействовать с физическими источниками данных.
В ASP.NET 2.0 будут входить провайдеры управления членством для баз данных
Microsoft Access, SQL Server, службы каталогов Active Directory и, вероятно, для
других источников данных. Вы можете написать собственные провайдеры для
каких-либо источников данных. Роб Говард (Rob Howard), менеджер программы
в группе Microsoft Web Platform and Tools детально рассмотрел эту тематику
в статье «Nothin» But ASP.NET», доступной по ссылке
По умолчанию сервис управления членством использует провайдер Access и хранит данные о членстве в файле AspNetDB.mdb, находящемся в подкаталоге Data приложения. Можно выбрать другие провайдеры, указав их в разделе <membership> файла Web.config. Редактировать Web.config вручную необязательно, его можно изменить с помощью Webadmin.axd. Следующий фрагмент взят из Web.config после того, как через Webadmin.axd я создал базу данных SQL Server с именем WhidbeyLogin и настроил сервис управления членством на ее использование: <membership defaultProvider="WhidbeyLogin">
<providers>
<add name="WhidbeyLogin"
type="System.Web.Security.SqlMembershipProvider, ..."
connectionStringName="webAdminConnection632112624221191376"
applicationName="/Whidbey" requiresUniqueEmail="false"
enablePasswordRetrieval="true" enablePasswordReset="false"
requiresQuestionAndAnswer="false"
passwordFormat="Encrypted" />
</providers>
</membership>Атрибут connectionStringName ссылается на строку подключения, содержащуюся в новом разделе <connectionStrings> файла Web.config. В ASP.NET 2.0 эту часть Web.config можно зашифровать, чтобы защитить строки подключения к базе данных. Область применения Webadmin.axd не ограничивается созданием баз данных и выбором провайдеров управления членством. Это средство годится для создания пользователей, управления удостоверениями защиты и для других целей. Webadmin.axd и Membership API предоставляют декларативные и программные средства управления зарегистрированными пользователями вашего сайта. Это огромный шаг вперед по сравнению с ASP.NET 1.x, где проблему управления удостоверениями приходилось решать в основном своими силами. Элементы управления регистрациейСервис управления членством значительно сократил объем кода, необходимого для проверки регистрационных данных и управления пользователями. Но, кроме этого сервиса, введено новое семейство элементов управления, называемых элементами управления регистрацией (login controls), которые еще больше упростили аутентификацию на основе форм. Такие элементы можно использовать как совместно с сервисом управления членством, так и без него. Однако они настолько хорошо интегрируются с этим сервисом, что при совместном использовании сервиса управления членством и элементов управления регистрацией типичные задачи вроде проверки имен и паролей пользователей и отправки забытых паролей по электронной почте можно решать без единой строки кода. Во врезке «Новые элементы управления, планируемые в ASP.NET 2.0» дан список элементов управления регистрацией, которые предполагается включить в ASP.NET 2.0. Элемент Login, показанный на рис. , — центральный элемент семейства. Он не только предоставляет гибко настраиваемый UI, но и может вызывать метод Membership.ValidateUser для проверки имени и пароля пользователя. Login также может вызвать метод FormsAuthentication.RedirectFromLoginPage, чтобы перенаправить пользователя на страницу, которую он пытался получить перед тем, как был направлен на страницу входа. Затем FormsAuthentication.RedirectFromLoginPage создает аутенификационные cookie. Позже я покажу, как работают Login и другие элементы управления регистрацией.
Диспетчер ролейСервис управления членством и элементы управления регистрацией были бы неполными без поддержки защиты на основе ролей. В ASP.NET 1.x, чтобы использовать роли при аутентификации на основе форм, приходилось писать код, сопоставляющий информацию о ролях каждому поступающему запросу. В ASP.NET 2.0 введен диспетчер ролей, применяемый отдельно или совместно с сервисом управления членством. Диспетчер ролей избавляет от необходимости писать такой код и упрощает авторизацию доступа пользователей к различным ресурсам, основанную на ролях. Управление ролями опирается на провайдеры и активизируется в Web.config. У диспетчера ролей есть API, реализованный в новом классе Roles, содержащем такие методы, как CreateRole, DeleteRole и AddUserToRole. Важно отметить, что вы можете вообще не вызывать эти методы, поскольку Webadmin.axd полностью поддерживает создание ролей, их назначение пользователям и т. д. Достаточно один раз активизировать защиту на основе ролей, и дальше она «просто работает», используя заданную информацию о ролях и директивы авторизации URL в файлах Web.config, уже знакомые вам по ASP.NET 1.x. Познакомившись с сервисом управления членством, элементами
управления регистрацией и диспетчером ролей, вы, наверное, хотели бы увидеть
пример использования этих трех средств. В примеры кода к этой статье, которые
вы можете скачать, входит двухстраничное приложение, демонстрирующее
аутентификацию на основе форм в стиле Visual Studio 2005. Чтобы развернуть
приложение и посмотреть, как оно работает, сначала скопируйте файлы
PublicPage.aspx, LoginPage.aspx и Web.config в виртуальный каталог вашего
Запустите Webadmin.axd и настройте сайт на поддержку аутентификации на основе форм, сервиса управления членством и диспетчера ролей, выбрав провайдер по своему усмотрению. Создайте пользователей Bob и Alice и роли Manager и Developer. Назначьте пользователю Bob роль Manager, а Alice — роль Developer. (Я не буду перечислять все выполняемые для этого операции, поскольку они скорее всего изменятся еще до того, как вы прочитаете статью. К счастью, интерфейс средства Webadmin.axd вполне понятен интуитивно, и в Webadmin.axd есть мастера, помогающие выполнить настройку.) Далее откройте PublicPage.aspx в браузере и щелкните кнопку View Secret Message, чтобы посмотреть ProtectedPage.aspx. ASP.NET перенаправит вас на LoginPage.aspx, в которой для запроса имени и пароля пользователя применяется элемент Login. Войдите, указав имя и пароль пользователя Bob. Страница ProtectedPage.aspx откроется в браузере, поскольку Bob имеет роль Manager, а файл Web.config в каталоге Secure разрешает доступ менеджерам. Заметьте: в элементе LoginName показывается имя пользователя, а в элементе LoginStatus — ссылка Log out. Наконец, закройте браузер, снова запустите его и откройте PublicPage.aspx. Щелкните View Secret Message и войдите как Alice. На этот раз вы не сможете открыть ProtectedPage.aspx, так как Alice не является менеджером. Я использовал аналогичное приложение для обучения аутентификации на основе форм в ASP.NET 1.x, но для версии 1.x пришлось написать гораздо больше кода. Версия 2.0 заслуживает похвалы за краткость кода — особенно за то, что не нужно писать код проверки удостоверений, введенных в форму входа, или сопоставлять имена пользователей ролям. Если вы до сих пор сомневаетесь, попробуйте написать то же самое приложение в ASP.NET 1.x! Кроме того, посмотрите изменения, внесенные Webadmin.axd в Web.config. Помимо всего прочего, вы увидите элемент <roleManager>, который активизирует диспетчер ролей и обычно задает провайдер, используемый при управлении ролями. Возможно, вас интересует, выполняется ли при каждом запросе обмен информацией между диспетчером ролей и базой данных, где хранятся роли. К счастью, нет. Диспетчер ролей хранит роли в cookie, причем шифрует их для конфиденциальности. В том невероятном случае, когда пользователю назначено так много ролей, что размера cookie не хватает для их хранения, cookie содержит список последних ролей, а запрос к базе данных применяется лишь при необходимости. ПерсонализацияЕще одна новинка — сервис персонализации, предоставляющий готовое
решение для хранения персональных параметров, задаваемых посетителями сайта.
В настоящее время такие параметры обычно хранят в cookie, в серверных базах
данных или и там, и там. Независимо от того, где они хранятся, ASP.NET 1.x мало
чем помогает в этом случае. Приходится своими силами создавать и настраивать
серверное хранилище этих данных и получать данные персонализации по именам
пользователей, прошедших аутентификацию, по cookie или Сервис персонализации ASP.NET 2.0 облегчает хранение и считывание персональных параметров пользователей. Он основан на профилях пользователей. Профили определяются в Web.config с помощью нового элемента <profile>. Ниже приведен фрагмент файла Web.config: <profile>
<properties>
<add name="Theme" />
<add name="Birthday" Type="System.DateTime" />
<add name="LoginCount" Type="System.Int32" defaultValue="0" />
</properties>
</profile>В нем определен профиль, содержащий три свойства: Theme строкового типа, Birthday типа DateTime и LoginCount целого типа. Последнее по умолчанию равно 0. В период выполнения можно обращаться к этим свойствам текущего пользователя через свойство Profile страницы, которое ссылается на экземпляр динамически скомпилированного класса со свойствами, заданными в профиле. Например, следующие операторы считывают значения свойств из профиля текущего пользователя: string theme = Profile.Theme; DateTime birthday = Profile.Birthday; int logins = Profile.LoginCount; Свойствам профиля можно присваивать значения: Profile.Theme = "SmokeAndGlass"; Profile.Birthday = new DateTime (1959, 9, 30); Profile.LoginCount = Profile.LoginCount + 1; Очевидным преимуществом персонализации является строгая типизация. Еще одно преимущество — то, что данные персонализации считываются и записываются по запросу. Этим они отличаются от состояния сеанса, которое загружается и сохраняется при каждом запросе независимо от того, используется оно или нет. Но, пожалуй, самое главное преимущество сервиса персонализации — не нужно явно задавать, где хранятся данные персонализации; система делает это за вас и хранит их постоянно. Когда эти данные потребуются, вы легко сможете обратиться к ним. В отличие от сеансов у профилей не истекает время ожидания. Так где же хранятся данные персонализации? Возможны варианты. Сервис персонализации основан на провайдерах, поэтому его можно настроить на использование любого доступного провайдера. В ASP.NET 2.0 войдут минимум два провайдера персонализации: для Access и для SQL Server. Если не указано иное, сервис персонализации использует провайдер для Access, по умолчанию хранящий данные персонализации локально в DataAspNetDB.mdb. Вместо Access можно задействовать SQL Server, изменив Web.config вручную или через Webadmin.axd. Если вы не хотите хранить данные персонализации ни в Access, ни в SQL Server, пишите свой провайдер. По умолчанию ASP.NET использует в качестве ключа к данным персонализации имя аутентифицированного пользователя, но можно настроить ASP.NET и на поддержку персонализации для анонимных пользователей. Прежде всего вы должны разрешить анонимную идентификацию, добавив в Web.config: <anonymousIdentification enabled="true" /> Затем добавьте allowAnonymous="true" в свойства профиля, которые вы хотите хранить для анонимных пользователей: <name="Theme" allowAnonymous="true" /> Теперь свойство Theme будет доступно как персональный параметр независимо от того, прошли ли аутентификацию пользователи, которые обращаются к вашему сайту. По умолчанию при анонимной идентификации, чтобы идентифицировать пользователей, повторно посещающих сайт, используются cookie. С помощью атрибутов, указываемых в <anonymousIdentification>, можно различными способами настроить эти cookie. Например, задать имя cookie и указать, надо ли шифровать содержимое cookie. Или настроить сервис персонализации на анонимную аутентификацию без cookie, при которой для идентификации пользователя, повторно посещающего сайт, применяется передача идентификатора сеанса через URL (URL munging). Предусмотрена даже возможность автоматического определения: если выполняющий запрос браузер поддерживает cookie, используются cookie, а в ином случае идентификатор сеанса передается в URL. Чтобы посмотреть, как работает персонализация, запустите один из примеров кода к статье — Personalize.aspx. Эта страница позволяет каждому посетителю сайта выбрать тему, затем запоминает ее и применяет всякий раз, когда посетитель возвращается на сайт. Заметьте: тема программно применяется к странице в PreInit — новом событии, которое происходит перед Init. Перед запуском примера разрешите анонимную аутентификацию и определите профиль, содержащий строковое свойство Theme. Следующий фрагмент кода из файла Web.config показывает, как решить эти две задачи: <configuration>
<system.web>
<anonymousIdentification enabled="true" />
<profile>
<properties>
<property name="Theme" allowAnonymous="true" />
</properties>
</profile>
</system.web>
</configuration>Зависимости кэша от
|
Цитата дня (все,добавить):
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|