воскресенье, 29 августа 2010 г.

Реализация гостевой книги на Asp.Net.

В этой статье мы реализуем гостевую книгу на 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>

&nbsp; &nbsp; &nbsp;<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>

&nbsp; &nbsp; &nbsp;<asp:DropDownList ID="ddlCity" runat="server" BackColor="#FFE0C0">

<asp:ListItem Selected="True" Value="Select One..."></asp:ListItem>

</asp:DropDownList>&nbsp;

<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>

&nbsp; &nbsp; &nbsp;

</td>

</tr>

</table>

</div>

</form>

</body>

</html>

А вот наша xsd схема базы.

clip_image002

3 комментария:

  1. Здравствуйте!
    Не могли бы вы поделиться исходниками?

    ОтветитьУдалить
    Ответы
    1. Да, конечно, вот исходники http://narod.ru/disk/46546256001.f29704acd7473433aad58b5fb18be589/BookWebSite.rar.html

      Удалить