Недавно я работал над своим сайтом и решил, что хочу создать гостевую книгу. Я начал поиск в Интернете, чтобы найти лучшую гостевую книгу для своего сайта, но когда ничего не появилось, я подумал: «Эй, я разработчик, почему бы не создать свою собственную?»
Создать гостевую книгу было очень легко — вы тоже можете это сделать. В этом уроке я покажу как. Я предполагаю, что у вас уже есть знания об основах программирования на ASP.NET, что вы знакомы с методами, используемыми в codebehind, и что у вас есть некоторые навыки XML / XSL.
обзор
Что нам нужно для того, чтобы создать гостевую книгу? Нам нужны две веб-формы: одна, в которой пользователь может ввести свое имя, адрес электронной почты и комментарий, а другая — для отображения этих комментариев по мере их входа в гостевую книгу. Конечно, мы можем встроить эту функциональность в одну веб-форму, но чтобы получить чистый код, я буду использовать две веб-формы с несколькими файлами кода (я расскажу об этом более подробно позже).
Нам также понадобится база данных для хранения информации, введенной через форму. Я использовал простой XML-файл (базу данных) для хранения информации, введенной пользователем. Для визуализации XML мы будем использовать XSL.
Итак, в итоге нам нужно следующее:
- Две веб-формы
- Codebehind
- База данных
- XSL
В гостевой книге обычно достаточно сохранить имя пользователя, местоположение, адрес электронной почты, адрес веб-сайта и комментарий. Конечно, вы можете хранить больше полей, но для наших целей этого достаточно. Мы будем хранить эти данные в файле XML, который будет выглядеть примерно так:
Подписание Гостевой Книги
Мы позволим пользователю «подписать» нашу гостевую книгу, введя некоторую информацию в простую веб-форму - в нашем примере это файл guestbook.aspx. Я использую следующие поля в веб-форме:
- имя
- Место расположения
- Эл. адрес
- Интернет сайт
- Комментарий
Вот код:
<?xml version="1.0" encoding="ISO-8859-1"?>
<guestbook>
<guest>
<name>Sonu Kapoor</name>
<location>Germany</location>
<email>[email protected]</email>
<website>www.codefinger.de</website>
<comment>This guestbook is written by Sonu Kapoor.
I hope you like it. To learn how to create such a guestbook,
read the whole story on my website.</comment>
</guest>
</guestbook>
Чтобы не вводить вас в заблуждение ненужным кодом, я удалил теги визуализации - включая таблицу, заголовок таблицы и т. Д. - из этого примера (хотя, конечно, все они включены в загружаемый код, приведенный в конце этого руководства). Так как мы отображаем только простую форму с несколькими полями и кнопками, вы не можете увидеть никакого реального программного кода в этом файле. Это потому, что все функции скрыты в коде.
В первой строке кода выше я установил атрибут SRC, чтобы файл ASP.NET знал, что мы используем файл codebehind Guestbook.cs. Я также установил атрибут <% @Page Language="C#" Debug="true" Src="Guestbook.cs"
Inherits="Guestbook" %>
<form runat="server">
...
...doing some visualisation stuff
...
<ASP:Textbox id="name" size="64" runat="server"/>
<asp:RequiredFieldValidator id="nameRequired" runat="server"
ControlToValidate="name"
ErrorMessage="You must enter a value into textbox1"
Display="dynamic">Enter name
</asp:RequiredFieldValidator>
<ASP:Textbox id="location" size="64" runat="server"/>
<asp:RequiredFieldValidator id="locationRequired" runat="server"
ControlToValidate="location" ErrorMessage="You must enter
a value into textbox1" Display="dynamic">
Enter location </asp:RequiredFieldValidator>
<ASP:Textbox id="website" size="64" runat="server"/>
<ASP:Textbox id="email" size="64" runat="server"/>
<ASP:Textbox id="comment" TextMode="Multiline"
columns="50" rows="10" wrap="true" runat="server"/>
<asp:RequiredFieldValidator id="commentRequired" runat="server"
ControlToValidate="comment" ErrorMessage="You must enter
a value into textbox1" Display="dynamic">
Enter comment </asp:RequiredFieldValidator>
<ASP:Button id="submit" runat="server" Text="Submit"
OnClick="Save_Comment"/>
<ASP:Button id="reset" runat="server" Text="Reset"/>
...
...doing some visualisation stuff
...
</script>
</form> Этот атрибут позволяет файлу знать, какой класс наследовать.
Далее я реализовал обязательные текстовые поля. Помните, что если вы хотите использовать одинаковые переменные в коде, они должны иметь одинаковый идентификатор в обоих файлах, и они должны быть объявлены как открытые.
В следующем разделе кода я использовал средства проверки ASP.NET. Эти элементы управления проверяют, ввел ли пользователь значение в текстовое поле, не совершая обхода на сервер. Код выполняется на стороне клиента.
Наконец, я реализовал кнопку отправки с событием Inherits
OnClick
Это событие используется для хранения информации, введенной пользователем в файл XML. Функция этого события доступна в Guestbook.cs. Я также реализовал кнопку сброса - и все! Больше ничего не нужно делать с веб-формой. Теперь, если вы запустите guestbook.aspx, вы должны увидеть веб-форму, которая выглядит следующим образом:
Теперь мы знаем, как отобразить веб-форму, но мы не видели код, который обрабатывает событие в guestbooks.cs. Давайте посмотрим на это сейчас.
Save_Comment
Вот это да! Это наш кодовый файл… но что на самом деле здесь происходит? Вы не поверите, но ответ: «не так много»!
Во-первых, мы реализуем минимально необходимые пространства имен, которые нам нужны для доступа к нескольким важным функциям. Затем я создаю новый класс с именем Guestbook:
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
public class Guestbook : Page
{
// Create the required webcontrols with the same name as
in the guestbook.aspx file
public TextBox name;
public TextBox location;
public TextBox email;
public TextBox website;
public TextBox comment;
public void Save_Comment(object sender, EventArgs e)
{
// Everything is all right, so let us save the data
into the XML file
SaveXMLData();
// Remove the values of the textboxes
name.Text="";
location.Text="";
website.Text="";
email.Text="";
comment.Text="";
}
}
private void SaveXMLData()
{
// Load the xml file
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load( Server.MapPath("guestbook.xml") );
//Create a new guest element and add it to the root node
XmlElement parentNode = xmldoc.CreateElement("guest");
xmldoc.DocumentElement.PrependChild(parentNode);
// Create the required nodes
XmlElement nameNode = xmldoc.CreateElement("name");
XmlElement locationNode = xmldoc.CreateElement("location");
XmlElement emailNode = xmldoc.CreateElement("email");
XmlElement websiteNode = xmldoc.CreateElement("website");
XmlElement commentNode = xmldoc.CreateElement("comment");
// retrieve the text
XmlText nameText = xmldoc.CreateTextNode(name.Text);
XmlText locationText = xmldoc.CreateTextNode(location.Text);
XmlText emailText = xmldoc.CreateTextNode(email.Text);
XmlText websiteText = xmldoc.CreateTextNode(website.Text);
XmlText commentText = xmldoc.CreateTextNode(comment.Text);
// append the nodes to the parentNode without the value
parentNode.AppendChild(nameNode);
parentNode.AppendChild(locationNode);
parentNode.AppendChild(emailNode);
parentNode.AppendChild(websiteNode);
parentNode.AppendChild(commentNode);
// save the value of the fields into the nodes
nameNode.AppendChild(nameText);
locationNode.AppendChild(locationText);
emailNode.AppendChild(emailText);
websiteNode.AppendChild(websiteText);
commentNode.AppendChild(commentText);
// Save to the XML file
xmldoc.Save( Server.MapPath("guestbook.xml") );
// Display the user the signed guestbook
Response.Redirect("viewguestbook.aspx");
}
}
Обратите внимание, что именно этот класс наследуется файлом guestbook.aspx. Затем мы объявляем 5 открытых переменных типа textbox. Помните, что здесь имена должны быть идентичны тем, которые мы использовали при создании текстовых полей в guestbook.aspx. Затем, как вы можете видеть, мы используем событие public class Guestbook : Page
Это событие используется для сохранения данных.
Процесс сохранения
Функция Save_Comment
Поскольку мы используем базу данных XML для хранения информации, мы используем классы SaveXMLData()
XmlDocument
Затем мы создаем новый XmlElement
XMLDocument
Требуемые узлы создаются с помощью функции CreateElement
XmlText
Затем мы сохраняем созданные узлы без каких-либо значений, используя функцию AppendChild
XmlDocument
И, наконец, значения сохраняются в только что созданных узлах, мы сохраняем все изменения в файле guestbook.xml и перенаправляем страницу в viewguestbook.aspx, где отображается сохраненный комментарий.
Просмотр гостевой книги
Чтобы просмотреть гостевую книгу, мы должны создать еще одну веб-форму:
<% @Page Language="C#" Debug="true" Src="ViewGuestbook.cs"
Inherits="ViewGuestbook" %>
Как видите, эта веб-форма на самом деле не так уж много делает. Он просто вызывает файл codebehind ViewGuestbook.cs. Давайте посмотрим на этот файл.
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using System.Xml.Xsl;
using System.IO;
public class ViewGuestbook : Page
{
private void Page_Load(object sender, System.EventArgs e)
{
//Load the XML file
XmlDocument doc = new XmlDocument( );
doc.Load( Server.MapPath("guestbook.xml") );
//Load the XSL file
XslTransform xslt = new XslTransform();
xslt.Load( Server.MapPath("guestbook.xsl") );
string xmlQuery="//guestbook";
XmlNodeList nodeList=doc.Document
Element.SelectNodes(xmlQuery);
MemoryStream ms=new MemoryStream();
xslt.Transform( doc, null, ms);
ms.Seek( 0, SeekOrigin.Begin );
StreamReader sr = new StreamReader(ms);
//Print out the result
Response.Write(sr.ReadToEnd());
}
}
Я создал этот класс для отображения всех комментариев, отправленных через гостевую книгу нашим пользователям. Опять же, первое, что мы делаем, это реализуем необходимые пространства имен, и, поскольку мы используем XSL для визуализации, мы должны обязательно включать пространство имен System.Xml.Xsl
Затем мы создаем новый класс с именем ViewGuestbook
Page_Load
Эта функция всегда вызывается при загрузке страницы или когда пользователь выполняет обновление. Здесь функция загружает файл guestbook.xml, а затем класс XslTranform используется для преобразования элементов XML в HTML, прежде чем мы загрузим guestbook.xsl с помощью объекта XslTransform
Далее мы создаем новый объект класса XmlNodeList
Затем мы используем класс MemoryStream
System.IO
Transform
Функция Seek
Затем мы создаем объект класса StreamReader
ReadToEnd()
Эта функция читает поток от текущей позиции до конца. Если вы запустите viewguestbook.aspx, вы должны увидеть такую веб-форму:
XSL
Как я уже упоминал, мы используем XSL для преобразования данных из XML в HTML. Я предполагал, что вы уже знакомы с XSLT, поэтому здесь я затрону только важные аспекты. Я использовал цикл XSL for-each для перебора всех гостей в книге, что выглядит примерно так:
<xsl:for-each select="//guest">
<xsl:apply-templates select="name"/>
</xsl:for-each>
И в цикле мы вызываем имя шаблона XSL, которое выглядит примерно так:
<xsl:template match="name">
<xsl:value-of select='.'/>
</xsl:template>
Вывод
Как видите, создать гостевую книгу не очень сложно. Удачи! И не забудьте скачать примеры файлов здесь .