Статьи

Создайте свою гостевую книгу в ASP.NET

Недавно я работал над своим сайтом и решил, что хочу создать гостевую книгу. Я начал поиск в Интернете, чтобы найти лучшую гостевую книгу для своего сайта, но когда ничего не появилось, я подумал: «Эй, я разработчик, почему бы не создать свою собственную?»

Создать гостевую книгу было очень легко — вы тоже можете это сделать. В этом уроке я покажу как. Я предполагаю, что у вас уже есть знания об основах программирования на 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. Эти элементы управления проверяют, ввел ли пользователь значение в текстовое поле, не совершая обхода на сервер. Код выполняется на стороне клиента.

Наконец, я реализовал кнопку отправки с событием InheritsOnClick Это событие используется для хранения информации, введенной пользователем в файл XML. Функция этого события доступна в Guestbook.cs. Я также реализовал кнопку сброса - и все! Больше ничего не нужно делать с веб-формой. Теперь, если вы запустите guestbook.aspx, вы должны увидеть веб-форму, которая выглядит следующим образом:

1061_webform1

Теперь мы знаем, как отобразить веб-форму, но мы не видели код, который обрабатывает событие в 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 Требуемые узлы создаются с помощью функции CreateElementXmlText Затем мы сохраняем созданные узлы без каких-либо значений, используя функцию 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

Затем мы создаем новый класс с именем ViewGuestbookPage_Load Эта функция всегда вызывается при загрузке страницы или когда пользователь выполняет обновление. Здесь функция загружает файл guestbook.xml, а затем класс XslTranform используется для преобразования элементов XML в HTML, прежде чем мы загрузим guestbook.xsl с помощью объекта XslTransform

Далее мы создаем новый объект класса XmlNodeList Затем мы используем класс MemoryStreamSystem.IOTransform Функция Seek

Затем мы создаем объект класса StreamReaderReadToEnd() Эта функция читает поток от текущей позиции до конца. Если вы запустите viewguestbook.aspx, вы должны увидеть такую ​​веб-форму:

1061_webform2

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>
Вывод

Как видите, создать гостевую книгу не очень сложно. Удачи! И не забудьте скачать примеры файлов здесь .