В этой статье мы реализуем гостевую книгу на asp.net.
Задание
Требуется создать вебприложение позволяющее пользователям сайта оставлять и просматривать сообщения гостевой книги.
Пользователь, оставляющий сообщение в книге, должен указать:
· Имя (обязательно, не может быть пустым)
· Электронный адрес (обязательно)
· Город (выпадающий список, зависящий от выбранной страны)
· Страна (выпадающий список)
· URL
· Само сообщение(обязательно)
Список доступных для выбора городов изменяется в зависимости от выбранной страны:
· Россия : Москва, С-Петербург, Казань, Рязань, Тверь, Другой
· США: Нью-Йорк, Вашингтон , Бостон, Атланта, Другой
· ЕЭС: Париж, Лондон, Берлин, Кёльн, Другой
· Другая: Другой
Сообщения хранятся в текстовом, либо xml файле. Вводимая пользователем информация должна проверяться с использованием специально предназначенных для это средств ASP.NET
Просматривающим кроме содержания гостевой книги доступен и IP-Адресс отправляющего.
Реализация
Опишем реализацию класса логики нашего приложения, все методы будут снабжены комментариями, поэтому я не буду описывать каждый метод отдельно.
using System; using System.Data; using System.Configuration; using System.Data.SqlClient; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using BookDataSetTableAdapters; using System.Collections; /// <summary> /// Summary description for GuestBook /// </summary> public class GuestBook { /// <summary> /// Типизированный датасет гостевой книги /// </summary> private BookDataSet dsBook; /// <summary> /// Адаптер для заполнения таблицы Comment /// </summary> private CommentTableAdapter taComment; /// <summary> /// Адаптер для заполнения таблицы Country /// </summary> private CountryTableAdapter taCountry; /// <summary> /// Адаптер для заполнения таблицы City /// </summary> private CityTableAdapter taCity; /// <summary> /// Адаптер для заполнения таблицы User /// </summary> private UserTableAdapter taUser; /// <summary> /// Таблица для вывода коммментариев на экран /// </summary> private BookDataSet.CommentDataTable dtCommentView; /// <summary> /// Поле тодько для чтения для dtCommentView /// </summary> public BookDataSet.CommentDataTable DtCommentView { get { return dtCommentView; } } /// <summary> /// Таблица для вывода городов на экран /// </summary> private BookDataSet.CityDataTable dtCityView; /// <summary> /// Конструктор /// </summary> public GuestBook() { dsBook = new BookDataSet(); taComment = new CommentTableAdapter(); taCity = new CityTableAdapter(); taCountry = new CountryTableAdapter(); taUser = new UserTableAdapter(); dtCommentView = new BookDataSet.CommentDataTable(); dtCommentView = taComment.GetDataView(); dtCityView = taCity.GetDataByIdCountry(0); taCity.Fill(dsBook.City); taCountry.Fill(dsBook.Country); taUser.Fill(dsBook.User); taComment.Fill(dsBook.Comment); } /// <summary> /// Получение списка стран /// </summary> /// <returns>Список стран</returns> public ArrayList GetCountryList() { ArrayList lstCountry = new ArrayList(); for (int i = 0; i < dsBook.Country.Rows.Count;i++) lstCountry.Add(dsBook.Country.Rows[i]["name"]); return lstCountry; } /// <summary> /// Получение списка городов данной страны /// </summary> /// <param name="idCountry">Данная страна</param> /// <returns>Список городов</returns> public ArrayList GetCityListByCountry(int idCountry) { taCity.FillByIdCountry(dtCityView,idCountry); ArrayList lstCity = new ArrayList(); for (int i = 0; i < dtCityView.Rows.Count; i++) lstCity.Add(dtCityView.Rows[i]["name"]); return lstCity; } /// <summary> /// Добавление комментария /// </summary> /// <param name="name">Имя гостя</param> /// <param name="city">Город гостя</param> /// <param name="email">Email гостя</param> /// <param name="body">Комментарий гостя</param> /// <returns></returns> public BookDataSet.CommentDataTable AddRecord(string name, string city, string email, string body) { BookDataSet.CityRow cityRow = null; BookDataSet.UserRow userRow = null; BookDataSet.CommentRow commentRow = null ; for (int i = 0; i < dsBook.User.Rows.Count; i++) { if (email == dsBook.User.Rows[i]["emale"].ToString()) { userRow = (BookDataSet.UserRow)dsBook.User.Rows[i]; break; } } if (userRow == null) { for(int i=0; i<dsBook.City.Rows.Count;i++) { if (city == dsBook.City.Rows[i]["name"].ToString()) { cityRow = (BookDataSet.CityRow)dsBook.City.Rows[i]; } break; } userRow = (BookDataSet.UserRow)dsBook.User.NewRow(); userRow.emale = email; userRow.name = name; userRow.CityRow = cityRow; dsBook.User.Rows.Add(userRow); taUser.Update(dsBook.User); } commentRow = (BookDataSet.CommentRow)dsBook.Comment.NewRow(); commentRow.addedDate = DateTime.Now; commentRow.body = body; commentRow.UserRow = userRow; dsBook.Comment.Rows.Add(commentRow); taComment.Update(dsBook.Comment); dtCommentView = taComment.GetDataView(); return dtCommentView; } } |
Далее оипишем логику страницы Default.cs.
using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.ComponentModel; using System.Collections; using BookDataSetTableAdapters; public partial class _Default : System.Web.UI.Page { /// <summary> /// Экземпляр guestBook /// </summary> GuestBook guestBook = new GuestBook(); /// <summary> /// загрузка стран и городов в DropDownList /// </summary> protected void ddlLoad() { int selectedCountry = ddlCountry.SelectedIndex; ddlCountry.Items.Clear(); ddlCountry.Items.Add("Select One..."); for (int i = 0; i < guestBook.GetCountryList().Count; i++) ddlCountry.Items.Add(guestBook.GetCountryList()[i].ToString()); ddlCountry.SelectedIndex = selectedCountry; int selectedCity = ddlCity.SelectedIndex; ddlCity.Items.Clear(); ddlCity.Items.Add("Select One..."); for (int i = 0; i < guestBook.GetCityListByCountry(selectedCountry).Count; i++) ddlCity.Items.Add(guestBook.GetCityListByCountry(selectedCountry)[i].ToString()); ddlCity.SelectedIndex = selectedCity; } /// <summary> /// Метод, выполняющийся при загрузке страницы /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ddlLoad(); rComment.DataSource = guestBook.DtCommentView; rComment.DataBind(); } } /// <summary> /// При нажатии на кнопку Ok /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btOk_Click(object sender, EventArgs e) { rComment.DataSource = guestBook.AddRecord(tbName.Text, ddlCity.SelectedValue, tbEmail.Text, tbComment.Text); rComment.DataBind(); } /// <summary> /// При смене выбранной страны /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ddlCountry_SelectedIndexChanged(object sender, EventArgs e) { ddlCity.SelectedIndex = 0; ddlLoad(); } } |
Вот и реализация Default.aspx.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> <script language="javascript" type="text/javascript"> // <!CDATA[ function TABLE1_onclick() { } // ]]> </script> </head> <body> <form id="form1" runat="server"> <div style="background-color: #ffcc99"> <table border="0" style="width: 603px; height: 358px; border-top-style: none; border-left-style: none; border-right-width: thick; border-right-color: olive; border-bottom-style: none; left: 10%; position: relative;" id="TABLE1" onclick="return TABLE1_onclick()" frame="border"> <tr align="center" > <td colspan="3" style="height: 91px; width: 703px;"> <asp:Label ID="lbWelcom" runat="server" Text="Welcome the Guest Book" Font-Names="Monotype Corsiva" Font-Overline="False" Font-Size="XX-Large" Font-Strikeout="False" ForeColor="Green"></asp:Label></td> </tr> <tr> <td colspan="3" style="border-left-color: #ffffcc; border-bottom-color: #ffffcc; border-top-style: dotted; border-top-color: #ffffcc; border-right-style: dotted; border-left-style: dotted; height: 26px; border-right-color: #ffffcc; border-bottom-style: none;"> <asp:ValidationSummary ID="vsError" runat="server" EnableTheming="False" Font-Size="X-Small" /> </td> </tr> <tr> <td style="border-left-color: #ffffcc; border-bottom-color: #ffffcc; border-top-style: none; border-top-color: #ffffcc; border-right-style: none; border-left-style: dotted; height: 45px; border-right-color: #ffffcc; border-bottom-style: none;"> <asp:Label ID="lbName" runat="server" Text="Name" ForeColor="Green"></asp:Label> <asp:TextBox ID="tbName" runat="server" Width="132px" BackColor="#FFE0C0"></asp:TextBox> <asp:RequiredFieldValidator ID="rfvName" runat="server" ErrorMessage="The name is not entered" ControlToValidate="tbName">*</asp:RequiredFieldValidator></td> <td style="border-left-color: #ffffcc; border-bottom-color: #ffffcc; border-top-style: none; border-top-color: #ffffcc; border-right-style: dotted; border-left-style: none; height: 45px; border-right-color: #ffffcc; border-bottom-style: none;"> <asp:Label ID="lbEmail" runat="server" Style="left: 1px" Text="E-mail" ForeColor="Green"></asp:Label> <asp:TextBox ID="tbEmail" runat="server" Height="17px" Width="151px" BackColor="#FFE0C0"></asp:TextBox> <asp:RegularExpressionValidator ID="revEmail" runat="server" ControlToValidate="tbEmail" ErrorMessage="The E-mail does not exist" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" Width="1px">*</asp:RegularExpressionValidator> <asp:RequiredFieldValidator ID="rfvEmail" runat="server" ControlToValidate="tbEmail" ErrorMessage="The E-mail is not entered">*</asp:RequiredFieldValidator></td> </tr> <tr> <td style="height: 45px; border-left-color: #ffffcc; border-bottom-color: #ffffcc; border-top-style: none; border-top-color: #ffffcc; border-right-style: none; border-left-style: dotted; border-right-color: #ffffcc; border-bottom-style: none;"> <asp:Label ID="lbCountry" runat="server" ForeColor="Green" Text="Country "></asp:Label> <asp:DropDownList ID="ddlCountry" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlCountry_SelectedIndexChanged" BackColor="#FFE0C0"> <asp:ListItem Selected="True">Select One...</asp:ListItem> <asp:ListItem>thy</asp:ListItem> </asp:DropDownList> <asp:CompareValidator ID="cvCountry" runat="server" ControlToValidate="ddlCountry" ErrorMessage="The country is not selected" Operator="NotEqual" ValueToCompare="Select One...">*</asp:CompareValidator></td> <td style="height: 45px; border-left-color: #ffffcc; border-bottom-color: #ffffcc; border-top-style: none; border-top-color: #ffffcc; border-right-style: dotted; border-left-style: none; border-right-color: #ffffcc; border-bottom-style: none;"> <asp:Label ID="lbCity" runat="server" ForeColor="Green" Text="City "></asp:Label> <asp:DropDownList ID="ddlCity" runat="server" BackColor="#FFE0C0"> <asp:ListItem Selected="True" Value="Select One..."></asp:ListItem> </asp:DropDownList> <asp:CompareValidator ID="cvCity" runat="server" ControlToValidate="ddlCity" ErrorMessage="The city is not selected" Operator="NotEqual" ValueToCompare="Select One...">*</asp:CompareValidator></td> </tr> <tr> <td style="border-left-color: #ffffcc; border-bottom-color: #ffffcc; border-top-style: none; border-top-color: #ffffcc; border-right-style: none; border-left-style: dotted; height: 45px; border-right-color: #ffffcc; border-bottom-style: none"> <asp:Label ID="lbURL" runat="server" ForeColor="Green" Text="URL:"></asp:Label> <asp:TextBox ID="tbURL" runat="server" BackColor="#FFE0C0"></asp:TextBox></td> <td style="border-left-color: #ffffcc; border-bottom-color: #ffffcc; border-top-style: none; border-top-color: #ffffcc; border-right-style: dotted; border-left-style: none; height: 45px; border-right-color: #ffffcc; border-bottom-style: none"> </td> </tr> <tr> <td colspan="2" style="border-left-color: #ffffcc; border-bottom-color: #ffffcc; border-top-style: none; border-top-color: #ffffcc; border-right-style: dotted; border-left-style: dotted; height: 26px; border-right-color: #ffffcc; border-bottom-style: none"> <asp:TextBox ID="tbComment" runat="server" Height="125px" TextMode="MultiLine" Width="643px" BackColor="#FFE0C0"></asp:TextBox></td> </tr> <tr> <td colspan="2" align="right" style="border-left-color: #ffffcc; border-bottom-color: #ffffcc; border-top-style: none; border-top-color: #ffffcc; border-right-style: dotted; border-left-style: dotted; height: 45px; border-right-color: #ffffcc; border-bottom-style: dotted"> <asp:Button ID="btOk" runat="server" Text="Ok" Width="156px" OnClick="btOk_Click" /></td> </tr> <tr> <td colspan="2" style="height: 36px"> </td> </tr> <tr> <td colspan="2"> <asp:Repeater ID="rComment" runat="server"> <HeaderTemplate> <tr> <td colspan="2" style="color: green; text-align: center; font-size: 24pt; font-family: Monotype Corsiva;"><b>Guest Book</b></td> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td style="background-color: #ffcc99;"> <asp:Label id="lbName" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"[\"name\"]") %> '/> <% Response.Write("(" + Request.ServerVariables["REMOTE_ADDR"]+")");%> </td> <td style="background-color: #ffcc99; text-align: right;" > <asp:Label id="lbDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"[\"addedDate\"]") %>'/> </td> </tr> <tr> <td colspan="2" > <asp:TextBox ID="lbBody" runat="server" Height="125px" TextMode="MultiLine" Width="643px" Text='<%# DataBinder.Eval(Container.DataItem,"[\"body\"]") %>' BackColor="#ffff66" Enabled="true" ReadOnly="true" /> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> </td> </tr> </table> </div> </form> </body> </html> |
А вот наша xsd схема базы.
Здравствуйте!
ОтветитьУдалитьНе могли бы вы поделиться исходниками?
Да, конечно, вот исходники http://narod.ru/disk/46546256001.f29704acd7473433aad58b5fb18be589/BookWebSite.rar.html
Удалить