Среда, 17.04.2024, 00:02
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Вхождения web-регистратора
00:52
Вхождения web-регистратора
Вхождения web-регистратора
Рассмотрев основной принцип построения страниц ASP.NET, в котором ис-
пользуется парадигма управляющего элемента/события, перейдем к вопросу
о том, каким образом этот принцип может быть использован для создания чего-
нибудь полезного. Мы создадим отдельную страницу, где будет целиком выводить-
ся вхождение web-регистратора, которое представляет собой список событий
и планов на конкретный день.
Одно из преимуществ создания активного web-сайта заключается в том, что не
требуется писать код на HTML каждый раз, когда необходимо дополнить или из-
менить его содержимое. Отсюда следует, во-первых, что добавлять в него новое
содержимое теперь могут и люди, ничего не понимающие в HTML, и, во-вторых,
что опытные программисты на HTML могут добавлять новое содержание быстро
и просто.
Традиционным способом наполнять сайт новым содержанием является предо-
ставление пользователю некоторой формы, в которую он вводит необходимую ин-
формацию. После щелчка мышью на кнопке Save Changes (сохранить изменения)
новое содержание появляется на сайте. Этот контент обычно хранится в какой-
либо базе данных.
В Настоящем примере мы собираемся хранить содержимое web-сайта в отдель-
ных XML-файлах на web-сервере, а не в базе данных. В каждом файле будет хра-
ниться одно "вхождение" web-регистратора или описание того, что случилось за
определенное время. Мы рассмотрим, каким образом можно создавать и разме-
щать такие вхождения на странице.
Приложения ASP.NET 689
Хранение вхождений web-регистратора
Как мы уже говорили, мы собираемся хранить XML-файлы, в которых содер-
жатся вхождения web-регистратора, на сервере. Однако нам придется преодолеть
несколько серьезных препятствий, прежде чем мы сумеем достигнуть этого.
Неизвестно, где именно хранятся все файлы только что созданного проекта.
Это происходит потому, что для организации хранения файлов VS взаимодействует
с web-сервером через нечто, называемое "FrontPage Extensions".
FrontPage Extensions имеют весьма пеструю историю.
Принцип, положенный в их основу, заключается в том,
что они делают внесение изменений в удаленный web-сайт
где-то в Интернете таким же простым, как копирование
из одной папки в другую, выполняемое на одном и том же
компьютере. Исторически сложилось так, что FrontPage
Extensions с трудом поддавались конфигурированию
администраторами, приводили к возникновению проблем
с обеспечением безопасности web-сайта и вообще обладали
некоторыми странностями. Можно только надеяться на то,
что версия, включенная в .NET, свободна от этих недостатков.
Это приводит к возникновению первой проблемы, с которой мы сталкиваемся,
поскольку в идеале необходимо знать, где именно располагаются эти файлы, с тем
чтобы иметь возможность осуществлять их дублирование. К счастью, ASP.NET
в состоянии определить их местонахождение.
Практикум: определение местонахождения web-сайта
1 Откройте редактор HTML для файла Default.aspx
и добавьте в него код, выделенный серым цветом.
(Для краткости часть уже существующего кода опущена.)
<form id="Default" method="post" runat=lfserver">
<div>
Disraeli's Weblog
<br>
<div>
<asp:Label id=•labelCopyright•
runat=•serverи >(copyright)<asp:Label>
• <ЬГ>
<diV> •
</form>
DefaulLaspx* Default.aspx.es*
ffs Weblog
zl
jQ Design] В HTML
2, Выберите пункт меню View) Design для открытия
программы Designer
3. Воспользовавшись окном с инструментами,
поместите с помощью мыши управляющий
элемент Label между двух новых тегов div,
как показано на рисунке слева.
Присвойте СВОЙСТВУ ID значение labelServerPath,
а СВОЙСТВУ Text — значение (serverPath) .
690 Глава 24
4. Щелкните мышью два раза на основании страницы и снова откройте
обработчик событий Load. Добавьте следующий код:
private void Page_Load(object sender, System.EventArgs e)
// какой сейчас год?
int year = DateTime.Now.Year;
if (year — 2001)
labelCopyright.Text = "Copyright &copy; Disraeli • + year;
else
labelCopyright.Text = "Copyright &copy; Disraeli 2001- + year;
// определение пути к серверу...
labelServerPath.Text = Server.MapPath(и я);
3btl:p://tocalhost/WebLog/Defaylt.a$pK - Mi
J File Edit View Favorites Tools Help ж1
links H
3 http://iocalho5t/Weblog/Defau(Laspx
Disraeli's Weblog
Copyright © Disraeli 2001
c:\inetpub\wwwrootVWebLog
UFone" iintranef
Запустите проект. В результате вы должны
увидеть то, что показано на рисунке слева.
Как это работает
По сравнению с самым первым примером
мы добавили новый управляющий элемент, ко-
торый мы собираемся использовать для выдачи
сообщения о пути, по которому располагается
наш web-сайт.
Класс System.Web.UI.Page, прОИЗВОДНЫМ ОТ
которого является класс CDefauit, обладает
целым рядом свойств, которые помогают нам
лучше понимать, что именно требуется от стра-
ницы, и позволяют получать доступ к некото-
рой информации, касающейся среды. Свойство server обладает методом MapPath,
который позволяет преобразовать виртуальный путь к web-сайту в физический
путь к web-серверу. В настоящем примере мы предложили ему преобразовать пус-
тую строку, что означает, что необходимо получить корневую папку web-сайта.
private void Page_Load{object sender, System.EventArgs e)
// какой сейчас год?
int year = DateTime.Now.Year;
if (year == 2001)
labelCopyright.Text = "Copyright &copy; Disraeli * + year;
else
labelCopyright.Text = "Copyright &copy; Disraeli 2001-* + year;
// определение пути к серверу...
labelServerPath.Text = Server.MapPath{-");
Если мы воспользуемся Internet
Explorer и пройдем по пути, выведенному
на web-странице, то мы действительно
сможем увидеть файлы. На рисунке спра-
ва выделены файл с расширением .aspx
и файл с расширением .cs, в котором
хранится "код поддержки".
Теперь перейдем к созданию XML-
файла, который затем может быть исполь-
зован для хранения вхождения нашего
web-регистратора.
•j.: ч-.<.•_ u;
n&Jlicenses.licx
|f| Global asax.cs
fif) Assembly Enfo.cs fp Sobdf.4S6X.resx ehlog.vsdisco
J2ob|ect(5) elected 1% Computer
Приложения ASP.NET 691
Практикум: создание XML-файла, содержащего вхождение
1. Создайте новую папку Entries в папке, где находится web-сайт.
Например, на компьютере автора эта папка получила
следующее название:
с:\InetPub\wwwroot\Weblog\Entries
До конца главы эта папка будет называться
"папкой с вхождениями".
2. Откройте Notepad. Создайте следующий файл:
. . .
<Entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Title>Hello!</Title>
<Details>These are the details of the Weblog entry</Details>
</Entry>
XML является чувствительным к регистру, поэтому убедитесь в том,
что вы ввели файл в точном соответствии с тем, как он изображен
здесь; например, убедитесь, что там, где требуется ввести <Titie>,
вы ввели именно <Title>, а не <title> или <TitLe>.
3. Сохраните файл под именем Entry.xmi в только что созданной
папке с вхождениями.
Вывод вхождений web-регистратора
Теперь есть XML-файл, в котором хранится одно вхождение, и можно пойти
еще дальше и создать еще несколько файлов — по одному на каждое вхождение,
которое мы хотим выводить в нашем web-регистраторе. Можно также создать
класс, который будет загружать эти файлы и представлять хранящиеся в них дан-
ные в виде свойств.
Посмотрим теперь, каким образом мы можем загружать эти файлы.
Практикум: загрузка файлов web-регистратора
1. Для загрузки XML-файлов мы планируем включить
статический метод в класс, который уже создан
Visual Studio.NET и имеет название Global. Этот класс
представляет собой наиболее подходящее место для
размещения общих методов и свойств, которые должны
быть доступны всем страницам web-приложения, и который
ВЫ Сможете Обнаружить, Заглянув на Страницу Global.asax.
2. Чтобы найти класс Global с помощью Solution Explorer,
щелкните правой КНОПКОЙ МЫШИ на файле Global.asax
(см. рис. справа) и выберите пункт меню View Code.
3. Вы можете заметить, что класс Global является производным
ОТ System.Web.HttpApplication. В ЭТОМ классе ОПИСаны
некоторые события, на которые мы можем реагировать,
когда наступают определенные события уровня приложения.
(В ASP.NET " у Р о в е н ь приложения" может считаться
"уровнем web-сайта".)
Щ Solution "Weblog' ( i project)
В & Weblog
S- (Hi References
g Assembtylnfo.cs
Ш Default,aspx
Enfcry.cs
Ц Styfe.css
• Web.eonfig
WebLog.vsdisco
lition.,» Class View
692 Глава 24
4. Добавьте следующий член в класс Global:
/// <summary>
/// Краткое описание класса Global.
/// </summary>
public class Global : System.Web.HttpApplication
, У/'
public static String EntryFilePath;
Обратите внимание на то, что мы используем класс string (заглавная S), а не
ключевое слово С# string (строчная s). Это сделано именно таким образом, по-
скольку необходимо, чтобы этот класс видимым образом подчинялся требованиям
Common Language Runtime, а если воспользоваться ключевым словом С# string,
то оно внутренне будет преобразовываться в System.string — мы просто хотим
сэкономить на этой излишней обработке.
5. Добавьте Следующий КОД В метод Application_Start():
protected void Application_Start (Object sender, EventArgs e)
{
// присваивание значения общему члену пути к папке вхождений...
EntryFilePath = Server.MapPath("Entries");
}
f
6. С помощью Solution Explorer создайте новый класс с именем Entry.
Прежде всего добавьте следующие операторы using в самое начало
файла:
using System;
using System.10;
using System.Xml.Serialization;
7. Затем добавьте следующие члены и соответствующие им свойства:
/// <summary>
/// Краткое описание класса Entry.
/// </summary>
public class Entry
{
/7 члены.
private DateTime „timestamp; ..
:private String _title;
private String ^details;
[XmllgnoreO ] public DateTime Timestamp
{
get
(
return _timestamp;
' : ' • >
set : _ ; ; ..: . .; . ; \ ;
{
_time stamp— value;
} -V' ';Ж- )}•;.;':::
. public String Title
{ • ' . .
get
{
_title; • • • •. • \ • ••••. '•:•:• •••: ' • •. • . . • • • : , : : • : ' V • ^ х - - ' • '• • .'
Приложения ASP.NET 693
set
' „title = value;
public String Details
{
••••; / " • • g e t • • " ^ •• • .
£
return ^details;
}
set
{
..details = value;
}
Названия этих свойств совпадают с именами вхождений XML-файла, который
был нами создан. Это сделано совершенно умышленно!
8. Переключитесь обратно на редактор кода для файла Global.asax.cs.
Добавьте ссылки на те же самые пространства имен в верхнюю
часть файла:
using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.SessionState;
using System.10;
using System.Xml.Serialization;
9. Теперь добавьте в класс Global следующий статический метод:
// LoadEntry - загрузка Ехождения с диска...
public static Entry LoadEntry(String filename)
{
// у нас имеется название, но нам необходим путь...
String filepath = EntryFilePath + "\\" + filename;
// открытие файла. ... •
FileStream file = new FileStream(filepath, FileMode.Open);
// создание сериализатора...
XmlSerializer serializer =-new XmlSerializer(typeof(Entry));
Entry newEntry = (Entry)serializer.Deserialize(file);
. :-. /7 закрытие файла. . . . .
file.Close();
// возврат вхождения...
return newEntry;
10. У нас появилась возможность создавать новые объекты Entry
и присваивать их свойствам Title и Details данные, хранящиеся
в XML-файле. Теперь необходимо создать некоторые управляющие
элементы на странице Default.aspx, с тем чтобы увидеть результаты
этого процесса.
694 Глава 24
11. Откройте редактор HTML ДЛЯ Default.aspx.
Добавьте следующий код:
<form id="Default11 method=llpost" runat="server">
<div>
Disraeli's Weblog
<br>
<div>
</form>
iY /Disraeli's Weblog
m
<br>
<div>
<asp:Label id=nlabelCopyright" runat="serverи >(copyright)<asp:Label>
12. Переключитесь в Designer для Default.aspx.
В каждый из двух появившихся элементов div
добавьте по новому управляющему элементу Label,
как показано на рисунке слева.
• Для первого управляющего элемента
присвойте свойство ID значению
lalbelEntryTitie. Присвойте
СВОЙСТВО Text Значению (entryTitle).
• Для второго управляющего элемента
присвойте свойство ID значению
laibeiEntryDetaiis. Присвойте
СВОЙСТВО Text Значению (entryDetails).
13. Щелкните два раза мышью на странице, чтобы открыть
обработчик событий Load. Измените последнюю строку,
ЧТОбы В ней ИСПОЛЬЗОВалОСЬ Общее СВОЙСТВО Global.EntryFilePath:
private void Page__Load( object sender, System. Event Args e)
// какой сейчас год?
int year = DateTime.Now.Year;
if (year == 2001)
labelCopyright.Text = "Copyright &copy; Disraeli * + year;
else
labelCopyright.Text = "Copyright &copy; Disraeli 2001-* + year;
// задание пути к серверу...
labelServerPath.Text = Global.EntryFilePath;
>
14. Добавьте этот код, чтобы использовать общий метод в Global
для создания нового объекта Entry на основе данных, хранящихся
в файле Entry.xmi, а затем наполните те управляющих элемента,
которые были только что добавлены:
private void Page_Load(object sender, System.EventArgs e)
// определение пути к серверу...
labelServerPath.Text = Global.EntryFilePath;
Приложения ASP.NET 695
/I загрузка вхождения с диска...
Entry entry = Global.LoadEntry{"Entry.xml'
labelEntryTitie.Text = entryTitle;
labelEntryDetails.Text = entryDetails;
Запустите проект. Вы увидите то, что изображено на ри-
сунке справа.
15. Чтобы убедиться, что изменения загружаются
с диска, воспользуйтесь Notepad, чтобы еще раз
отредактировать файл Entry.xml. Измените данные
так, чтобы они приняли следующий вид:
Нш Eefe> View Favotfte* Topte' Heip
Disraeli's Weblog
HeUol
Ibese are the details of the Weblog entry
Copyright О DisracS 200)
c:\iiietpub\wwwroot\WebLog\Entries
Й Done ; | > Щ loci intr
©Done'

<Entry xmlns:xsi="http: //www.w3 .org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2 0 01/XMLSchemaи >
<Title>Hellof again]</Title>
<Details>I've changed the details in the XML file...</Details>
</Entry>
16. Сохраните этот файл и обновите страницу
в Internet Explorer. Вы увидите внесенные
изменения (см. рис. слева).
Как это работает
Первое, что мы сделали в Global.asax,— это повторно
ВОСПОЛЬЗОВалИСЬ методом Server.MapPath ДЛЯ получения
физического пути к виртуальной директории Entries, ко-
торый можно использовать в программе. После получения
первого запроса на .aspx-страницу вызывается метод
Appiication_start о , позволяющий задавать глобальные
данные приложения (или глобальные данные сайта).
В данном случае мы сохраняем физический путь в общем
члене EntryFilePath:
protected void Application_Start (Object sender, EventArgs e)
{
// присвоение значения физического пути общему члену. ..
EntryFilePath = Server.MapPath(*Entries");
Disraeli's Weblog
Hello, again \
| I have changed the details in the XML file...
Copyright <D Disraeli 2001
c:\inetpub\wwwroot\WebLog\Entries
intranet
Теперь мы подходим к статическому методу LoadEntryO, который загружает
XML-файлы с данными из папки с вхождениями и переносит содержимое в опре-
деленный нами КЛаСС Entry. Для ЭТОГО ИСПОЛЬЗуем Класс XmlSerializer ИЗ ПрОСТран-
СТВа имен System.Xml.Serialization. Далее вызывается его метод DeserializeO,
который принимает XML-строку из файла и преобразовывает (десериализует) на-
ходящиеся в ней данные, чтобы использовать их для присвоения свойствам объек-
та, которые хранятся в экземпляре класса Entry.
// LoadEntry - загрузка вхождения с диска...
public static Entry LoadEntry(String filename)
{
// у нас есть название, но нам необходим путь. . .
String filepath = EntryFilePath + "\\" + filename;
// открытие файла...
FileStream file • new FileStream(filepath, FileMode.Open);
696 Глава 24
II создание сериализатора и использование его для наполнения свойств
// вновь созданного объекта Entry...
XmlSerializer serializer = new XmlSerializer(typeof(Entry));
Entry newEntry = (Entry)serializer.Deserialize(file);
// закрытие файла...
file.CloseO;
// возврат вхождения...
return newEntry;
}
Из Defauit.aspx.es мы опять настраиваем обработчик событий Load. На этот
раз мы исходим из предположения, что XML-файл всегда называется Entry.xmi;
после этого мы присваиваем свойство Text каждому из управляющих элементов
следующим образом:
private void Page_Load(object sender, System.EventArgs e)
{
// какой сейчас год?
int year = DateTime.Now.Year;
if (year == 2001)
labelCopyright.Text = •"Copyright &copy; Disraeli • + year;
else
labelCopyright.Text = "Copyright &copy; Disraeli 2001-" + year;
// определение пути к серверу...
labelServerPath.Text = Global.EntryFilePath;
// • ЗагруЗКа ВХОЖДвНИЯ С ДИСКа... /, ' .
Entry entry = Global.LoadEntry{"Entry.xmi");
labelEntryTitle.Text = entryTitle;
labelEntryDetails.Text = entryDetails;
Вывод времени
Теперь нам предстоит вывести время рядом с вхождением. Для этой цели мы
собираемся использовать значение времени, когда этот файл был сохранен по-
следний раз, и поместить это значение в свойство вхождения Times tamp. После
этого мы сможем немного изменить код, чтобы он сначала выводил дату и время,
а затем всю остальную информацию вхождения.
Практикум: вывод времени
1. Для определения времени мы воспользуемся значением, когда
данное вхождение изменялось последний раз. В большинстве случаев
это будет время последней записи вхождения на диск.
2. Воспользуйтесь Solution Explorer, щелкните правой кнопкой мыши
на Global.asax и выберите пункт меню View Code.
Найдите метод LoadEntry и добавьте следующий код:
// LoadEntry — загрузка вхождения с диска...
public static Entry LoadEntry(String filename)
//закрытие файла
file.Close () ;
// обновление даты и времени...
newEntry.Timestamp = new Filelnfo(filepath).LastWriteTime;
Приложения ASP.NET 697
// возврат вхождения...
return newEntry;
3. Открываем редактор ДЛЯ Default.aspx И ВНОСИМ
следующие изменения:
private void Page_Load(object sender, System.EventArgs e)
// определение пути к серверу.. .
labelServerPath.Text = Global.EntryFilePath;
// загрузка вхождения с диска...
Entry entry = Global.LoadEntry(*Entry.xml");
labelEntryTitie.Text = entryTitle;
labelEntryDetails.Text = entry.Timestamp.ToString("ddd") + "
entry.Timestamp.ToLongDateStringO + " - " + entryDetails;
}
Як hltp://Jocalhost/V/ebLwj/ D«f
Favorites Toois Нф
^laiiii
Dtsraeli's Weblog
Hello, again!
Tuesday, 17 July 2001 -1 have changed the details
in the XML file.,,
Copyright
c:\Lneipub\wwwroot\WebLog\Eiitnes
Запустите проект. Теперь вы должны увидеть на экране
время, как показано на рисунке слева.
Как это работает
У объекта Entry уже есть соответствующий член для
хранения даты и времени. Здесь используется атрибут
Xmllgnore, ДЛЯ ТОГО чтобы XmlSerializer осуществлял СООТ-
ветствующие действия, именно поэтому нам не приходится
включать их в XML-файл. Все, что помечено этим атрибу-
том, не будет ни сохраняться в XML-файле, ни загружаться
из XML-файла.
/// <summary>
///• Краткое описание класса Entry.
/// </summary>
public class Entry
{
/ / члены...
[Xmllgnore()] public DateTime Timestamp;
public String Title;
public String Details;
ПрИ СОЗДаНИИ Объекта Entry М Ы ВОСПОЛЬЗОВаЛИСЬ Объектом System.IO.Filelnfo,
в котором хранится дата последнего сохранения файла:
// LoadEntry - загрузка вхождения с диска...
public static Entry LoadEntry(String filename)
// закрытие файла...
file.Close();
// обновляем дату и время. . .
newEntry-Timestamp - new Filelnfo(filepath).LastWriteTime;
// возврат вхождения...
return newEntry;
Когда мы подошли к фактическому выводу страницы, мы воспользовались дву-
мя методами для преобразования даты в строки. Первый вызов TostringO оформ-
лен так, чтобы выводить название дня недели. Второй вызов ToLongDateString ()
698 Глава 24
обрабатывает остальную часть длинной даты, используя локальные установки
компьютера. В США сначала будет выводиться месяц, а затем число, в Велико-
британии — сначала число, а потом месяц и т. д. Это хорошая идея — использо-
вать локализованную версию функции для работы с датами, в противном случае
ваши пользователи могут быть сбиты с толку.
private void Page_Load(object sender, System.EventArgs e)
// определение пути к рерверу. . .
labelServerPath.Text = Global.EntryFilePath;
// загрузка вхождения с диска...
Entry entry = Global.LoadEntry(''Entry.xml") ;
labelEntryTitie.Text = entryTitle;
labelEntryDetails.Text = entry.Timestamp.ToString("ddd") + "
entry.Timestamp.ToLongDateStringO + " - " + entryDetails;
Улучшение внешнего вида
Пока страница имеет весьма уродливый внешний вид. HTML (с точки зрения
сегодняшнего дня) — это устаревшая технология, которая прежде всего предназ-
началась для организации доступа к однообразным научным документам. Придание
документам обновленного и современного вида возлагается, в основном, на поль-
зователей Паутины, поэтому если мы хотим, чтобы документы выглядели соответ-
ствующим образом, то придется позаботиться об этом самим.
Существует целый ряд технологий, которые можно использовать для улучшения
представления страницы, но в данном случае проще всего воспользоваться техно-
логией Cascading Style Sheets (CSS — каскадные таблицы стилей). CSS — это
огромная тема, поэтому мы не будем останавливаться на ней очень подробно, бу-
дет достаточно сказать, что CSS — это специальным образом отформатированный
текстовый файл, в котором хранятся все шрифты, цвета и стили, необходимые
браузеру для представления HTML в приятной для глаза форме.
Практикум: улучшение внешнего вида
1. Первое, что требуется сделать,— это создать таблицу стилей,
которая будет распространяться на все страницы нашего сайта.
Для этого войдите в Solution Explorer, щелкните правой кнопкой мыши
на проекте Weblog и выберите пункт меню Add | Add New Item.
Найдите в списке Templates вхождение Style Sheet. Выберите его
и присвойте имя style.ess. Щелкните мышью на Open.
2. Добавьте следующий код в новую таблицу стилей:
body
{
padding-right: Opx; . -
padding-left: Opx;
font-size: 8pt;
padding-bottom: Opx;
margin: Opx;
padding-top: Opx;
font-family: Verdana, Arial;
Приложения ASP.NET 699
.header
{
padding-right: 5px;
padding-left: 5px;
padding-bottom: lOpx;
padding-top: lOpx;
background-color: #000099;
font-weight: bold;
font-size: 14pt;
color: white;
}
. normal
{
padding-right: 5px;
padding-left: 5px;
font-size:8pt;
}
.normalHeading
{
padding-right: 5px;
padding-left: 5px;
font-size:12pt;
font-weight: bold;
}
.entryTitle
{
padding-right: 5px;
padding-left: 5px;
padding-bottom: lpx;
padding-top: lpx;
font-weight: bold;
font-size: lOpt;
color: white;
background-color: #66cc99;
}
.entryDate
{
font-weight: bold;
color: #333399;
font-size: 8pt;
>
.entry
{
padding-right: 5px;
padding-left: 5px;
padding-top: 2px;
font-size: 8pt;
}
Если вы не хотите вводить все это вручную, возьмите файл style.ess из загру-
жаемого кода; если он до сих пор не включен в проект, щелкните правой кнопкой
мыши на узле Weblog project в Solution Explorer, выберите пункт меню Add | Add
Existing Item и добавьте файл с расширением .ess.
3. Чтобы воспользоваться этой таблицей стилей, необходимо привязать ее
к странице. Откройте редактор HTML для файла Default.aspx
и добавьте следующую строку в верхнюю часть файла:
<html>
<head>
<meta content="Microsoft Visual Studio 7.0" name=HGENERATOR">
<meta content="C#H name^'CODE.LANGUAGE1^
700 Глава 24
<meta content="JavaScript (ECMAScript) " name=llvs_defaultClientScriptll>
<meta content="http://schemas.microsoft.com/intellisense/ie5"
name =" vs__target Schema ">
<link rel="stylesheet" href="style.ess">
</head>
4. Внесите изменения в выделенные строки и добавьте новый код,
где это необходимо:
<%@ Page language="c#" Codebehind="Default.aspx.es" AutoEventWireup="false"
Inherits^1 WebLog.CDefault" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN* >
<html>
<head>
<meta content="Microsoft Visual Studio 7.0" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript (ECMAScript)" name="vs_defaultClientScript">
<meta content="http: //schemas.microsoft.com/intellisense/ie511
name=•vs_targetSchema">
<link rel=nstylesheet" href= "style.ess">
</head>
<body>
<form id="Default" method="post" runat="server">
<div сlass="header">
Disraeli's Weblog
,<br> .
<div class="entryTitle">
<asp:label id="labelEntryTitle" runat="server"
(entryTitle)</asp:label>
<div class="entry">
<asp:Label id="labelEntryDetails" runat="server"
(entryDetails)</asp:label>
<br>
<hr color="#OOOOOOn>
<div class="normal"> .
<asp:label id="labelСоруright• runat=n server">
(copyright)</asp:label>
<br> •
<div class="normal">
<asp:Label id="labelServerPath" runat="server">
(serverpath)</asp:Label>
</form>
</body>
</html>
5. Последнее изменение в коде, которое необходимо внести,
касается Defauit.aspx.cs. Откройте этот файл в редакторе
и внесите в метод Page_Load() следующие изменения:
private void Page_Load(object sender, System.EventArgs e)
// определение пути к серверу...
labelServerPath.Text = Global.EntryFilePath;
// загрузка вхождения с диска...
Entry entry = Global.LoadEntry("Entry.xml");
labelEntryTitle.Text = entry.Title;
Приложения ASP.NET 701
labeiEntryDetails.Text = "<font class=entryDate>//
entry.Timestamp.ToStriRgCddd") + u, " +
entry.Timestamp.ToLongDateStringO + * <font> *
entiryDetails;
/!ос.
1 fifes , Vfev# mm
Favorites Tools
Help *
_ _ • • ;
D i s r a e l i ' s W e b l o g
* ' V , , H . - . ,
T u e s d a y , I ? J u l y 2 D O I - 1 h a v e c h a n g e d t h e d e t a t f s
i n t h e X M L f i l e . . .
C o p y r i g h t © D i s r a e l i 2 0 0 1
c ; V n s t p u b \ w w w r o o t \ W e b L o g \ £ n t r i e s
После компиляции и запуска проекта вы должны
увидеть то, что изображено на рисунке слева.
Как это работает
Каскадные таблицы стилей позволяют определять
стили, которые впоследствии будут применяться ко
всем элементам, расположенным на странице. Эти
стили создаются в виде файлов с расширением .ess,
подобных созданному нами файлу style.ess.
Обсуждение технологии CSS выходит за рамки на-
стоящей книги, но основная ее суть сводится к следу-
ющему: есть возможность либо изменить стиль стан-
дартных HTML-элементов, таких как <body> или <ui>,
либо описать новые классы, которые в терминологии
CSS означают группу стилей, объединенных в некото-
рую логическую единицу. Чтобы модифицировать уже
существующий элемент, требуется просто указать имя этого элемента, а затем
добавить соответствующий CSS-код. Именно таким образом мы переопределяем
то, каким образом выводится на экран тег <body>:
padding-right: Opx;
padding-left: Opx;
font-size: 8pt;
padding-bottom: Opx;
margin: Opx;
padding-top: Opx;
font-family: Verdana, Arial;
M
Новым классам может даваться произвольное имя, однако оно должно предва-
ряться точкой. Вот как создается класс header:
.header
{
padding-right: 5px;
padding-left: 5px;
padding-bottom: lOpx;
padding-top: lOpx;
background-color: #000099;
font-weight: bold;
font-size: 14pt;
color: white;
Чисто технически от вас не требуется понимания CSS для того, чтобы
вы могли редактировать его в Visual Studio.NET. Можете быть совер-
шенно спокойны — перед вами действительно код таблицы стилей. Если
выбранным в настоящий момент документом является таблица стилей,
то с помощью пункта меню View | Other Windows | Document Outline вы
можете войти в редактор CSS (см. рис. справа).
Elements
-Ф body
1 Classes
« • deader
•—• .normal -
- • .entry Title
- Ф .entryDate
— Ф * entry
| Element IDs
1 ф Blocks
3£тоо1Ь... Ш CSS.
702 Глава 24
Если щелкнуть правой кнопкой мыши на каком-либо из элементов или классов
и выбрать пункт Build Style, то откроется диалоговое окно, с помощью которого
можно внести некоторые незначительные изменения в CSS-код на интуитивном
уровне.
После того, как таблица стилей построена, ее необходимо привязать к соответ-
ствующей странице. Это позволит браузеру получить информацию о том, что тре-
буется загрузить описанные стили и применить их к документу. Это осуществляется
посредством элемента link:
<html>
<head>
<meta content="Microsoft Visual Studio 7.0" name="GENERATORS
<meta content="C#" name ="CODE_LANGUAGE">
<meta content^ JavaScript (ECMAScript) " name="vs_defaultClientScriptll>
<meta content=nhttp://schemas.microsoft.com/intellisense/ie5"
name="vs_targetSchema">
«clink rel="stylesheet" href ="style.ess">
</HEAD>
Для того чтобы задать класс, который следует использовать с элементом на
странице, применяется атрибут class. Он позволяет передать браузеру информа-
цию о том, какой именно стиль должен применяться к данному элементу. Мы со-
общаем информацию о том, что элемент div, содержащий текст Disraeli's Weblog,
должен использовать класс header следующим образом:
<div class="header">
Disraeli's Weblog
Мы будем использовать данную таблицу стилей на протяжении оставшейся ча-
сти настоящей главы, хотя мы не будем разбираться в этих стилях более подробно.
Вывод списков вхождений
К настоящему моменту мы научились выводить на экран отдельные вхождения
web-регистратора, но как нам быть в том случае, если требуется вывести несколь-
ко вхождений на одной о той же странице?
Вывод списков — довольно распространенная задача, часто стоящая перед ак-
тивными web-сайтами независимо от того, требуется вывести список продаваемой
продукции на сайте электронной коммерции или записи пользователя, хранящиеся
в базе данных. В ASP.NET предусмотрен целый ряд способов, которые облегчают
вывод списков, и некоторые из этих способов мы рассмотрим в настоящем разделе.
Практикум: вывод списков вхождений web-регистратора
? C:\Inetpub\wwwrout\Webtog\Ef
View Favorites Tools h»
^Search
j Entry, xmt
|7Q2 bytes My Computer
1. Для того чтобы иметь
возможность просматривать список
вхождений web-регистратора,
необходимо, чтобы в папке Entries
находилось более одного вхождения!
Используя Internet Explorer
и Notepad, создайте какие-нибудь
дополнительные вхождения.
Можете назвать их произвольным
образом (см. рис. слева).
Приложения ASP.NET 703
2. В классе Global потребуется определить новый статический метод,
который будет возвращать список всех вхождений. Откройте
в редакторе кода файл Global.asax и добавьте следующий код:
// LoadAllEntries - осуществляет загрузку с диска всех вхождений...
public static Entry[] LoadAllEntries(}
{
// определение пути, по которому располагаются вхождения...
Directorylnfo entryFolder = new Directorylnfo(EntryFilePath);
// получение списка файлов...
Filelnfo[] files = entryFolder.GetFiles<);
// создание массива вхождений.
Entry[] entries - new Entry[files.Length];
// просмотр в цикле всех файлов и их загрузка.«.
int index = 0; . •
foreach(FileInfo file in files)
{
entries[index] = LoadEntry(file.Name);
index++; •• ••
// возврат списка.
return entries;
'У-
3. Теперь требуется исключить из файла
Default.aspx код, ответственный
за вывод двух управляющих элементов.
Откройте программу-разработчик
и удалите два управляющих элемента
Label. Это должно выглядеть,
как показано на рисунке справа.
ВЙЁ^ШВ^ОIsraelis Weblog Ш
ЕВДИ Э is f ee 11 s KVebloflj
4. Удалите два тега div, как показано на
рисунке слева.
ШЗШжтМ>1$гае11*$ Weblog ШЕЛ
5. Воспользовавшись окном с инструментами,
перенесите управляющий элемент DataList
и разместите его между двумя символами
"возврат каретки". Результат представлен
на рисунке справа.
6. Управляющий Элемент DataList ДОВОЛЬНО
мощный, но он требует выполнения огромного
количества различных действий и манипуляций
надЛЛ. В нем используется полная
t * Datali *.: 1 D Right ckk and choose a set of templates to edit the:.' content, j1
7У Theitu.'< • requ/ed.
1ПГ
704 Глава 24
1ШНШЫ>1$гае!Г$ «Weblog ШШ
привязка данных, т.е. в методе Page_Load() приходится
передавать этому управляющему элементу массив объектов Entry.
Он проходит весь список в цикле и на каждой итерации
представляет набор описанных нами управляющих элементов.
Каждый из этих управляющих элементов привязан посредством
данных к некоторому свойству класса Entry. Поэтому можно добавить
в управляющий элемент DataList управляющий элемент Label
и привязать его свойство Text к свойству Title и т. д.
7. Прежде чем предпринимать какие бы то ни было шаги, следует
изменить значение свойства ID управляющего элемента DataList
на dataListEntries.
8. Щелкните правой кнопкой мыши на элементе DataList и выберите
пункт меню Edit Template | Item Template. Это переведет управляющий
элемент в особый режим, в котором мы получаем возможность
управлять тем, что конкретно будет происходить на каждой итерации
ПО Массиву Объектов Entry.
9, Воспользовавшись окном с инструментами,
перенесите управляющий элемент Label
и разместите его в пустом пространстве,
расположенном непосредственно под строкой
ItemTemPlate (см. рис. Слева).
Любые управляющие элементы, которые
располагаются Внутри ВХОЖДеНИЯ ItemTemPlate,
будут выводится на экран при каждой очередной
итерации по массиву. Поэтому, если в массиве
есть, например, три объекта Entry, в конечном
итоге окажется три управляющих элемента Label.
10. При выбранном элементе Label с помощью окна
Properties измените значение свойства cssciass
на entryTitie. Внешний вид управляющего элемента
должен измениться в соответствии выбранным стилем.
11. Найдите вхождение DataBindings и выберите его. Щелкните мышью
на многоточии (...), расположенном рядом с ним, для перехода
в окно для привязки данных.
В списке, расположенном с левой стороны, перечислены
все свойства управляющего элемента Label, которые допускают
привязку к данным. Из него следует выбрать свойство Text.
После этого все действия, которые мы будем производить на правой
стороне окна, будут относиться к настройкам привязки к данным
ИМенНО СВОЙСТВа Text.
12. Выберите переключатель Custom binding expression и введите
следующий код в текстовое окно, находящееся под этим
переключателем:
DataBinder.Eval(Container, "Dataltern.Title")
Результат проиллюстрирован на рисунке (см. стр. 705, справа).
Приложения ASP.NET 705
13. Для сохранения привязки к данным
щелкните мышью на ОК.
14. Необходимо проверить, работает ли
то, что мы уже сделали. В случае
положительного результата
проверки можно перейти к выводу
даты и другой информации.
На http;//bca!host/Wcbtog/0e*
File View Favorite* Tools
j Address j
* junks
Go
D i s r a e l i s W e b l o g
Copyright © Disraeli 2001
c:\inetpub\wwwroot\WebLGg\Entries
J l l
I Dor»
Ubeli DataBindtngs
Select the property to bind. Then efcher use Simple bihdrig Jo fend to a rfdta item and set
formating or use Custorn fcsndsng to type in a binding expression.
gndabie Properties:
_ AccsssKey
Binding for Tex? - •
; . BorderWWfch
;••• Ш enabled
/"• FeffCetor
... Tex?;
- Ш Vsifcfc
' :-; width
В U л->: •* •
з г
•Пш "3
, .
Щелкните два раза мышью на странице, чтобы открыть
обработчик событий Load. Для того, чтобы получить
картину, изображенную на рисунке слева, нужно
откомпилировать и запустить проект после добавления
в обработчик событий Load следующего кода:
private void Page__Load(object sender, System.EventArgs e)
// определение пути к серверу. . .
labelServerPath.Text = Global.EntryFilePath;
// загрузка всех вхождений, имеющихся на диске.
Entry[] entries = Global.LoadAllEntries();
datalistEntries,DataSource - entries; :
datalistEntries.DataBindO ;
Как это работает
Код, создающий массив на диске из всех объектов Entry, крайне прост. Для
этого требуется лишь обратиться к объекту System, io. Directoryinf о для форми-
рования списка всех объектов System, i o . Directoryinf о для папки Entries и пройти
ПО СПИСКУ В ЦИКЛе, ИСПОЛЬЗуя метод LoadEntry.
// LoadAllEntries — осуществляет загрузку с диска всех вхождений...
public static Entry[] LoadAllEntries()
{
// определение пути, по которому располагаются вхождения...
Directoryinfо entryFolder = new DirectoryInfo(EntryFilePath);
// получение списка файлов...
Filelnfo[] files = entryFolder.GetFiles(};
// создание массива вхождений...
Entry[] entries = new Entry [files.Length];
// просмотр в цикле всех файлов и их загрузка...
int index = 0;
foreach(FileInfo file in files)
706 Глава 24
entries[index] = LoadEntry(file.Name);
index++;
>
// возврат списка...
return entries;
После того как мы получаем список в Page__Load (), мы передаем его управляю-
щему Элементу DataList И вызываем метод DataBindO:
private void Page__Load(object sender, System.EventArgs e)
// определение пути к серверу. . .
labelServerPath.Text = Global.EntryFilePath;
// загрузка всех вхождений, имеющихся на диске.
Entry[] entries = Global.LoadAllEntries{);
datalistEntries.DataSource - entries;
datalistEntries.DataBind();
Это равносильно просьбе, обращенной к управляющему
элементу DataList, чтобы пройти по очереди по всем объек-
там Entry, следуя правилам, определенным в шаблоне.
Единственным правилом, описанным нами в шаблоне, явля-
ется правило, согласно которому один раз на каждой итера-
ции требуется вывести управляющий элемент Label — при
этом свойству Text элемента Label должно быть присвоено
текущее значение свойства Title того объекта Entry, рас-
сматриваемому в текущий момент (см. рис. слева).
Вывод подробной информации
Теперь можно выводить заголовок, но как быть с осталь-
ной информацией? В данном разделе мы рассмотрим, каким
образом можно выводить подробную информацию и дату.
Практикум: вывод остальной части вхождения web-регистратора
1. Способ, с помощью которого мы выводили дату вхождения
web-регистратора, был очень сложным. Поскольку управляющий
элемент DataList предназначен специально для работы с общими
свойствами, мы создадим такое свойство объекта Entry, которое
будет возвращать дату в виде строки. Откройте редактор кода
для Entry и введите следующий код:
public String TimestampAsString
get
{
return Timestamp.ToStringCdddd") + ", " +
Timestamp.ToLongDateStringO ;
Приложения ASP.NET 707
2. Откройте Designer ДЛЯ Default.aspx.
Управляющий элемент DataList может перейти
в такое состояние, в котором его нельзя
редактировать. Это выглядит так, как показано
на рисунке справа.
3. Щелкните правой кнопкой мыши на управляющем
элементе и снова выберите пункт меню Edit
Template | Item Template. Установите курсор
после зеленого управляющего элемента Label,
нажмите клавишу Shift и, не отпуская ее,
нажмите клавишу Return. В результате вместо
символа возврата каретки будет добавлен
символ новой строки, что приведет к появлению
очень большого пустого пространства между
заголовком и самим вхождением.
D i s r a e l i ' s W e b l o g
k
Databound
Databound
Databound
Dulubuurtd
1 Databaiind

!
! .
I I
( c o p y r i g h t )
f s e r v e r p a t h )
. . . . . . Zl
Disraeli's Weblog
datalistEntries - «em Templates ф
([copy right)
(serverpath)
4. Добавьте еще один управляющий элемент Label
ПОД уже Существующим ЭЛемеНТОМ Label
зеленого цвета. После этого добавьте пробел,
затем тире, еще один пробел, а затем еще один —
последний — элемент Label, как показано
на рисунке слева.
Маленькая зеленая стрелка в верхнем
левом углу каждого элемента обозначает
управляющий элемент.
5. Выберите первый новый управляющий элемент Label.
Присвойте его СВОЙСТВУ CssStyle Значение entryDate.
6. Выберите свойство DataBindings. Щелкните мышью
на многоточии и откройте окно DataBindings.
Убедитесь, что в списке, расположенном слева,
выбрано свойство Text, и щелкните мышью
на переключателе Custom binding expression.
Добавьте следующий код:
DataBinder.Eval(Container, "Dataltem.TimestampAsString")
7. Щелкните мышью на OK, для того чтобы сохранить привязку.
8. Выберите второй из двух новых управляющих элементов Label.
Присвойте его-свойству CssStyle значение entry.
9. Найдите и выберите свойство DataBindings. Щелкните мышью
на многоточии и откройте окно DataBindings. Убедитесь, что в списке,
расположенном с левой стороны, выбрано свойство Text,
и щелкните мышью на переключателе Custom binding expression.
Добавьте следующий код:
DataBinder.Eval(Container, "Dataltem.Details')
708 Глава 24
^hUp://loca?hos«
*" '' * "» ' i) J] $ ^Search ^jFevontes #l<-*&9 ;) >Jr [irks.
: [ Address fgj wr- ;••)-. *'~-.^\ -CM , :"/» f. .• aspv _J <,**'*SO
| D i s r a e l i ' s W e b l o g
, 10 July 2001 ~ And this is wh*t h&ppensd today. Bxc&iftQj huh?
Tuesday, 17 July 2001 - I h^ve changed the details in the Xt4L fite...
yj 17 JuJy 2001 " More entries?! WOW*
Copyright © Djsrae^ 20QI
Откомпилируйте и запустите проект. Вы уви-
дите приблизительно то, что изображено на ри-
сунке слева.
Как это работает
Поскольку при работе с управляющим элемен-
том DataList проще всего использовать свойства,
мы создали свойство, доступное в режиме "только
чтение", С именем TimestampAsString, KOTOpOe
должно возвращать отформатированную версию
Свойства Timestamp. Мы не ВКЛЮЧИЛИ В ЭТО
свойство предложения set, поскольку это пред-
полагало бы, что тот, кто использует данный
объект, может попросить нас преобразовать это
Значение ИЗ СТрОКИ В System.DateTime. И ХОТЯ
в этом также нет ничего недостижимого, такая задача выходит за рамки работы,
которую мы собираемся возложить на данный объект.
public String TimestampAsString
get
{
return Times tamp. ToStr ing ("dddd") + " , " +
Timestamp.ToLongDateString();
После добавления этого свойства включение дополнительных элементов Label
в шаблон свелось к простому повторению действий, выполненных ранее.
Важное замечание об управляющем элементе DataList
и общих членах
Выражение, введенное в поле Custom binding expression элемента DataList, бу-
дет работать только со свойствами. Оно не сможет работать с общими членами.
Если у вас есть такой код:
public class Entry
// члены. var container = document.getElementById('nativeroll_video_cont'); if (container) { var parent = container.parentElement; if (parent) { const wrapper = document.createElement('div'); wrapper.classList.add('js-teasers-wrapper'); parent.insertBefore(wrapper, container.nextSibling); } }
Категория: информатика | Просмотров: 1271 | Добавил: basic | Рейтинг: 5.0/1
Всего комментариев: 2
2 Qmminnohem  
0
Шанс настоящего преумножения средств и ответ на вопрос - ммм отзывы. Наша работа - Ваши доходы, мы работаем для Вас! Зарабатывай по полной - думай о завтрашнем дне! Нет проигравших - денег хватит всем, тысячи людей в этом уже убедились!

МММ 2012 - [url=http://newmmm2012.com]Новости ммм сегодня.
[/url]

1 Gaztraiteve  
0
На продаже приборов для контроля веществ в различных средах специализируется наша организация. У нас всегда можно купить газоанализаторы, программируемые кондуктометры, концентратомеры, плотномеры и pH-электроды. В своей работе мы делаем основной упор на работу с конечным потребителем. Доставка товаров производится по всей России. Сделайте свой выбор на сайте и оформите заказ!

GazoAnalisator Ru - [url=http://gazoanalisator.ru]вискозиметр
[/url]

Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz