Главная страница статей --> Советы по фотошопу, графике и хитрости в построении php кода

Гостевая книга на ASP.NET

Источник: realcoding.net

Приложение ASP.NET, написанное от начала и до конца, представляет собой гостевую книгу

Скачать исходники - 22 кб

src=http://codeproject.com/aspnet/GuestbookLK/Guestbook.gif

Ввведение


Этот проект дает возможность посетителям оставлять сообщения в гостевой книге на сайте. Проект состоит из двух частей:

  • Создание сообщений.
  • Просмотр гостевой книги.

База данных


Гостевая книга будет сохраняться в XML-файле guestbook.xml на сервере. Кодировка XML-файла изменена на ISO-8859-1, чтобы можно было обрабатывать специальные символы. Вот структура XML-файла:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<guestbook>
    <guest private="yes">
        <name>Laurent Kemp?t;/name>
        <homepage url="http://perso.wanadoo.fr/laurent.kempe/">Tech Head</homepage>
        <location>Illzach, France</location>
        <comment>First to sign the guestbook ;)</comment>
        <date>Thursday, May 30, 2002 - 10:29 AM</date>
    </guest>
</guestbook>

Вам будет предложено ввести следующую информацию:

  • Имя
  • E-Mail
  • Название домашней страницы
  • URL домашней страницы
  • Адрес
  • Комментарии
  • PRIVATE - Я хочу, чтобы только владелец сайта видел мой email

Приложение


Для того, чтобы иметь возможность легко изменять метод отображения гостевой книги, требуется разделить код и данные. Для выполнения этого требования я выбрал использование XSLT-преобразования XML-файла; при этом пользователям возвращается HTML-файл.

Создание сообщений


Страница, которая позволяет пользователям оставлять сообщения в гостевой книге, содержится в Web-форме Sign.aspx. Эта страница требует от пользователя заполнить некоторые поля (textboxes) инфомацией, которая будет отображаться в гостевой книге. Чтобы проверять введенную информацию, мы используем RequiredFieldValidator. Кроме того, мы также используем RegularExpressionValidator для проверки адреса Email.

Когда посетитель заполнил все поля, он нажимает кнопку продолжения, и страница возвращает событие, перехватываемое методом ButtonContinue_Click. Этот метод загружает базу данных XML, получает информацию, введенную пользователем, и добавляет ее в начало XML-файла. Затем новая база данных сохраняется на диске сервера и пользователь перенаправляется на страницу просмотра.

private void ButtonContinue_Click(object sender, System.EventArgs e)
{
    //Загрузить базу данных гостевой книги
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load( Server.MapPath("guestbook.xml") );

    //Получить статус private
    string strPrivate;
    if ( CheckBoxPrivate.Checked )
        strPrivate = "yes";
    else
        strPrivate = "no";

    //Создать новый элемент
    XmlElement elem = xmldoc.CreateElement("guest");
    elem.SetAttribute("private", strPrivate);

    //Добавить новое сообщение в первый узел
    xmldoc.DocumentElement.PrependChild(elem);

    addTextElement( xmldoc, elem, "name", TextBoxName.Text );
    addTextElement( xmldoc, elem, "email", TextBoxEMail.Text );
    addTextElement( xmldoc, elem, "homepage", TextBoxHomepageTitle.Text );

    XmlAttribute newAttr = xmldoc.CreateAttribute("url");
    newAttr.Value = TextBoxHomepageURL.Text;

    elem.LastChild.Attributes.Append( newAttr );
   
    addTextElement( xmldoc, elem, "location", TextBoxLocation.Text );
    addTextElement( xmldoc, elem, "comment", TextBoxComments.Text );

    //Записать дату
    string strDate = DateTime.Now.ToLongDateString() +
                     " - " +
                     DateTime.Now.ToLongTimeString();

    addTextElement( xmldoc, elem, "date", strDate );

    xmldoc.Save( Server.MapPath("guestbook.xml") );

    Response.Redirect("view.aspx");
}

Мы использовали метод addTextElement для построения нового сообщения пользователя в базе данных:

private void addTextElement( XmlDocument doc, XmlElement nodeParent,
                             string strTag, string strValue )
{
    XmlElement nodeElem = doc.CreateElement( strTag );
    XmlText nodeText = doc.CreateTextNode( strValue );
    nodeParent.AppendChild( nodeElem );
    nodeElem.AppendChild( nodeText );
}

Просмотр


Для просмотра всех записей гостевой книги мы добавили еще одну Web-форму View.aspx в проект. В методе Page_Load мы загрузили базу данных XML и XSLT-файл. Мы выполнили преобразование и вывели результат в элемента управления Literal Web Form.

private void Page_Load(object sender, System.EventArgs e)
{
    //Загрузить базу данных гостевой книги из xml-файла
    XmlDocument doc = new XmlDocument( );
    doc.Load( Server.MapPath("guestbook.xml") );

    //Получить номер запрошенной страницы
    string strPageAsked = Request.QueryString["page"];

    //Если страница не определена, использовать первую
    if ( strPageAsked == null )
    {
        strPageAsked = "1";
    }

    int nGuestPerPage = 5;
    int nGuests = doc.ChildNodes[1].ChildNodes.Count;

    int nPageAsked = System.Convert.ToInt32(strPageAsked);

    int lowerbound = 1 + ( nPageAsked - 1 ) * nGuestPerPage;
    int upperbound = lowerbound + nGuestPerPage - 1;

    //Выполнить XSLT-преобразование
    XslTransform xslt = new XslTransform();
    xslt.Load( Server.MapPath("guestbook.xslt") );

    //Построить список параметров XLST
    XsltArgumentList xsltArgs = new XsltArgumentList();
    xsltArgs.AddParam("lowerbound", "", lowerbound.ToString());
    xsltArgs.AddParam("upperbound", "", upperbound.ToString());

    //Преобразовать XML в HTML
    MemoryStream ms = new MemoryStream();
    xslt.Transform( doc, xsltArgs, ms );
    ms.Seek( 0, SeekOrigin.Begin );

    StreamReader sr = new StreamReader(ms);

    //Вставить результаты в страницу View.aspx
    LiteralGuests.Text = sr.ReadToEnd();

    //Вставить навигатор страниц внизу страницы
    int nPages = 0;
   
    if (( nGuests % nGuestPerPage) != 0 )
        nPages = 1 + (nGuests / nGuestPerPage);
    else
        nPages = (nGuests / nGuestPerPage);

    LiteralGuests.Text += "Page(s) ";

    for (int n = 1; n <= nPages; n++)
    {
        LiteralGuests.Text += "<font face=verdana size=2>"
        LiteralGuests.Text += "<a href=/Guestbook/View.aspx?page=";
        LiteralGuests.Text += n.ToString();
        LiteralGuests.Text += ">";
        LiteralGuests.Text += n.ToString();
        LiteralGuests.Text += "</a></font> ";
    }

    sr.Close();
}

Все преобразование из XML в HTML выполняются в файле guestbook.xslt. Это преобразование использует два параметра: lowerbound и upperbound, представляющие собой нижнее и верхнее значение индексов сообщений, соответствующие отображаемой странице гостевой книги.
Основное, что мы сделали - это цикл от lowerbound до upperbound и преобразование:

<xsl:for-each select="//guest[position() <= $upperbound and position() >= $lowerbound]">
    <xsl:apply-templates select="name"/>
</xsl:for-each>

Вот пример преобразования, используемого для отображения посетителя и его email, если не определен флаг private:

<xsl:template match="name">
    <xsl:choose>
        <xsl:when test="../@private=yes">
            <font face="verdana" size="2">
                <b><xsl:value-of select=. /></b>
            </font>
        </xsl:when>
        <xsl:otherwise>
            <font face="verdana" size="2">
                <b><a HREF="mailto:{../email}"><xsl:value-of select=. ></a></b>
            </font>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Вы можете посмотреть файл guestbook.xslt для дальнейшей информации.

Заключение


Я хотел показать, что важно разделять данные от процессов их представления, и в этом очень помогает XML. Если вы хотите изменить представление гостевой книги, вам нужно только изменить файл guestbook.xslt.



Похожие статьи:
- Защищенная почта с Web-интерфейсом
- Учебное пособие по Link Popularity
- Как «заценить» свой сайт?
- Электронные рассылки
- Работа с файлами в PHP
- ASP.NET 2.0. Обзор новых сервисов, элементов управления и средств (1 часть)
- Создание форума в ASP.NET
- Кэширование страниц в PHP
- Приемы безопасного программирования веб-приложений на PHP
- Чтение текстовых баз данных из ASP
- Установка Perl
- Использование удалённых/remote файлов
- Вопрос управления контентом


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.002]