ایجاد دفتر مهمان (Guest Book) در ASP.NET
اخیراً داشتم روی وبسایتم کار میکردم و تصمیم گرفتم یک دفترچه مهمان (guestbook) راهاندازی کنم. شروع به جستجو در وب کردم تا بهترین دفترچه مهمان را برای وبسایتم پیدا کنم، اما وقتی هیچ کدام پیدا نشد، با خودم فکر کردم «من یک توسعهدهنده هستم، چرا خودم یک دفترچه مهمان درست نکنم؟»
ایجاد یک guestbook بسیار آسان بود - شما هم میتوانید این کار را انجام دهید. در این آموزش، نحوه انجام آن را به شما نشان خواهم داد. فرض میکنم که شما از قبل با اصول اولیه برنامهنویسی ASP.NET آشنا هستید، تکنیکهای مربوط به codebehind را میدانید و تا حدودی با XML/XSL آشنایی دارید.
نکات کلیدی
ایجاد یک دفتر مهمان در ASP.NET شامل استفاده از دو فرم وب است - یکی برای ورودی کاربر و دیگری برای نمایش نظرات، فایلهای codebehind، یک پایگاه داده برای ذخیره اطلاعات و XSL برای تجسم.
فرم ثبت مهمان شامل فیلدهایی برای نام، مکان، ایمیل، وبسایت و نظر است. اطلاعات وارد شده توسط کاربر با استفاده از کنترلهای اعتبارسنج ASP.NET و رویداد دکمه ارسال، در یک فایل XML ذخیره میشود.
فایل codebehind تابعی به نام SaveXMLData() دارد که اطلاعات کاربر را در پایگاه داده XML ذخیره میکند. سپس این دادهها با استفاده از XSLT برای تبدیل دادههای XML به HTML در فرم وب دوم نمایش داده میشوند.
طراحی دفتر مهمان را میتوان با استفاده از HTML و CSS سفارشی کرد و ویژگیهای اضافی مانند کپچا برای امنیت، سیستم امتیازدهی، مدیریت ورودیها، قابلیت جستجو و دکمههای اشتراکگذاری در رسانههای اجتماعی را میتوان اضافه کرد. دادههای دفتر مهمان را میتوان با خروجی گرفتن از پایگاه داده به یک فایل، پشتیبانگیری کرد.
نمای کلی
برای ایجاد یک دفترچه مهمان به چه چیزهایی نیاز داریم؟ ما به دو فرم وب نیاز داریم: یکی که کاربر بتواند نام، آدرس ایمیل و نظر خود را در آن وارد کند و دیگری که برای نمایش این نظرات هنگام ورود به دفترچه مهمان استفاده میشود. البته میتوانیم این قابلیت را در یک فرم وب ایجاد کنیم، اما برای داشتن یک کد تمیز، از دو فرم وب با چندین فایل codebehind استفاده خواهم کرد (در ادامه با جزئیات بیشتری در مورد این موارد صحبت خواهم کرد).
همچنین به یک پایگاه داده برای نگهداری اطلاعات وارد شده از طریق فرم نیاز داریم. من از یک فایل XML ساده (یک پایگاه داده) برای ذخیره اطلاعات وارد شده توسط کاربر استفاده کردم. برای نمایش XML از XSL استفاده خواهیم کرد.
بنابراین، به طور خلاصه، ما به موارد زیر نیاز داریم:
دو فرم وب
کدپشتی
پایگاه داده
XSL
در یک دفترچه مهمان، معمولاً ذخیره نام، مکان، آدرس ایمیل، آدرس وبسایت و نظر کاربر کافی است. البته، میتوانید فیلدهای بیشتری را ذخیره کنید، اما برای اهداف ما، همینها کافی است. ما این دادهها را در فایل XML ذخیره خواهیم کرد که چیزی شبیه به این خواهد بود:
<?xml version="1.0" encoding="ISO-8859-1"?>
<guestbook>
<guest>
<name>Sonu Kapoor</name>
<location>Germany</location>
<email>sonu@codefinger.de</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>امضای دفتر مهمانان
ما به کاربر اجازه میدهیم تا با وارد کردن برخی اطلاعات در یک فرم وب ساده، دفترچه مهمان ما را «امضا» کند - در مثال ما این فایل guestbook.aspx است. من از فیلدهای زیر در فرم وب استفاده میکنم:
نام
مکان
ایمیل
وبسایت
نظر دهید
کد به این صورت است:
<% @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>برای جلوگیری از گیج شدن شما با کدهای غیرضروری، تگهای بصریسازی - شامل جدول، سربرگ جدول و غیره - را از این مثال حذف کردهام (البته، البته همه اینها در کد قابل دانلودی که در انتهای این آموزش ارائه شده است، گنجانده شدهاند). از آنجایی که ما فقط یک فرم ساده با چند فیلد و دکمه نمایش میدهیم، نمیتوانید هیچ کد برنامهنویسی واقعی را در این فایل ببینید. دلیل این امر این است که تمام قابلیتها در پشت کد پنهان شدهاند.
در خط اول کد بالا، من ویژگی SRC را تنظیم کردم تا به فایل ASP.NET اطلاع دهم که ما از فایل Codebehind به نام Guestbook.cs استفاده میکنیم. من همچنین ویژگی Inherits با نام کلاس مربوطه تنظیم کردهام. این ویژگی به فایل اطلاع میدهد که از کدام کلاس ارثبری کند.
در مرحله بعد، فیلدهای متنی مورد نیاز را پیادهسازی کردهام. به یاد داشته باشید که اگر میخواهید از متغیرهای یکسان در codebehind استفاده کنید، باید در هر دو فایل شناسه یکسانی داشته باشند و باید به صورت عمومی (public) تعریف شوند.
در بخش بعدی کد، از کنترلهای اعتبارسنجی ASP.NET استفاده کردم. این کنترلها بررسی میکنند که آیا کاربر مقداری را در فیلد متنی وارد کرده است یا خیر، بدون اینکه نیازی به رفت و برگشت به سرور باشد. کد در سمت کلاینت اجرا میشود.
در نهایت، یک دکمه ارسال با رویداد OnClick به نام Save_Comment پیادهسازی کردم. این رویداد برای ذخیره اطلاعات وارد شده در فایل XML توسط کاربر استفاده میشود. تابع این رویداد در Guestbook.cs موجود است. من همچنین یک دکمه تنظیم مجدد پیادهسازی کردم - و تمام! دیگر نیازی به انجام کاری با فرم وب نیست. اکنون، اگر guestbook.aspx را اجرا کنید، باید فرم وب را به شکل زیر ببینید:

حالا میدانیم که چگونه فرم وب را نمایش دهیم، اما کدی که رویداد را در guestbooks.cs مدیریت میکند را ندیدهایم. بیایید نگاهی به آن بیندازیم.
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 ایجاد میکنم:
public class Guestbook : Page توجه داشته باشید که این کلاس است که توسط فایل guestbook.aspx به ارث برده میشود. سپس ۵ متغیر عمومی از نوع textbox تعریف میکنیم. به یاد داشته باشید که در اینجا، نامها باید با نامهایی که هنگام ایجاد کادرهای متنی در guestbook.aspx استفاده کردیم، یکسان باشند. سپس، همانطور که میبینید، از رویداد Save_Comment استفاده میکنیم که توسط دکمه ارسالی که در فایل guestbookpx قرار دادهایم، فعال میشود. این رویداد برای ذخیره دادهها استفاده میشود.
فرآیند پسانداز
تابع SaveXMLData() اطلاعات را برای ما ذخیره میکند. از آنجایی که ما از یک پایگاه داده XML برای ذخیره اطلاعات استفاده میکنیم، از کلاسهای XmlDocument ، XmlElement و XmlText استفاده میکنیم که تمام توابع مورد نیاز ما را فراهم میکنند.
در مرحله بعد، یک شیء کلاس XMLDocument جدید ایجاد میکنیم و فایل guestbook.xml را بارگذاری میکنیم. گرههای مورد نیاز با تابع 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());
}
} من این کلاس را برای نمایش تمام نظرات ارسال شده از طریق guestbook به کاربرانمان ایجاد کردهام. باز هم، اولین کاری که انجام میدهیم، پیادهسازی فضاهای نام مورد نیاز است و از آنجایی که از XSL برای تجسم استفاده میکنیم، باید مطمئن شویم که فضای نام System.Xml.Xsl را نیز لحاظ کردهایم.
سپس یک کلاس جدید به نام ViewGuestbook ایجاد میکنیم که دارای یک تابع داخلی خصوصی به نام Page_Load است. این تابع همیشه هنگام بارگذاری صفحه یا زمانی که کاربر صفحه را تازه میکند، فراخوانی میشود. در اینجا، این تابع فایل guestbook.xml را بارگذاری میکند و سپس از کلاس XslTranform برای تبدیل عناصر XML به HTML قبل از بارگذاری guestbook.xsl با کمک شیء XslTransform استفاده میشود.
در مرحله بعد، یک شیء جدید از کلاس XmlNodeList ایجاد میکنیم که به ما امکان انتخاب گرههای مورد نیاز را میدهد. سپس از کلاس MemoryStream که از طریق فضای نام System.IO در دسترس است، برای ایجاد یک جریان که حافظه را به عنوان حافظه پشتیبان دارد استفاده میکنیم و از تابع Transform برای اختصاص دادههای xml به این جریان حافظه استفاده میکنیم. تابع Seek موقعیت فعلی را روی صفر تنظیم میکند.
سپس یک شیء از کلاس StreamReader ایجاد میکنیم که جریان را میخواند و نتیجه را با کمک تابع ReadToEnd() چاپ میکند. این تابع جریان را از موقعیت فعلی تا انتها میخواند. اگر viewguestbook.aspx را اجرا کنید، باید یک فرم وب مانند این را ببینید:

XSL
همانطور که قبلاً اشاره کردم، ما از XSL برای تبدیل دادهها از XML به HTML استفاده میکنیم. فرض کردهام که شما از قبل با XSLT آشنا هستید، بنابراین در اینجا فقط به جنبههای مهم آن اشاره میکنم. من از یک حلقه for-each در XSL برای پیمایش تمام مهمانهای موجود در کتاب استفاده کردهام که چیزی شبیه به این است:
<xsl:for-each select="//guest">
<xsl:apply-templates select="name"/>
</xsl:for-each>و در حلقه، نام الگوی XSL را فراخوانی میکنیم که چیزی شبیه به این است:
<xsl:template match="name">
<xsl:value-of select='.'/>
</xsl:template>نتیجهگیری
همانطور که میبینید، ایجاد یک دفتر مهمان خیلی سخت نیست. موفق باشید! و فراموش نکنید که فایلهای نمونه را از اینجا دانلود کنید.
بیشتر بخوانید
سوالات متداول در مورد ایجاد دفترچه مهمان با ASP.NET
چگونه میتوانم طراحی دفتر مهمان خود را در ASP.NET سفارشی کنم؟
سفارشیسازی طراحی دفتر مهمان در ASP.NET شامل تغییر کد HTML و CSS است. میتوانید طرحبندی، طرح رنگ، فونتها و سایر عناصر طراحی را تغییر دهید. اگر با HTML و CSS آشنا هستید، میتوانید مستقیماً کد را ویرایش کنید. در غیر این صورت، منابع و آموزشهای آنلاین زیادی برای کمک به یادگیری شما وجود دارد. به یاد داشته باشید که همیشه قبل از ایجاد هرگونه تغییر، از کد خود نسخه پشتیبان تهیه کنید.
چگونه میتوانم برای اهداف امنیتی، یک کپچا به دفترچه مهمان خود اضافه کنم؟
افزودن یک کپچا به دفترچه مهمان میتواند به جلوگیری از ورود هرزنامه و رباتهای خودکار کمک کند. ASP.NET پشتیبانی داخلی برای کپچا ارائه میدهد. میتوانید از سرویس reCAPTCHA ارائه شده توسط گوگل که رایگان و پرکاربرد است استفاده کنید. باید سایت خود را در reCAPTCHA ثبت کنید، کلیدهای لازم را دریافت کنید و سپس کد reCAPTCHA را به فرم دفترچه مهمان خود اضافه کنید.
آیا میتوانم یک سیستم امتیازدهی به دفترچه مهمان خود اضافه کنم؟
بله، شما میتوانید یک سیستم امتیازدهی به دفترچه مهمان خود اضافه کنید. این کار را میتوان با اضافه کردن یک فیلد جدید به پایگاه داده خود برای ذخیره امتیاز و سپس اضافه کردن کد لازم به فرم دفترچه مهمان برای انتخاب امتیاز توسط کاربران انجام داد. همچنین باید کد خود را برای نمایش امتیازها با هر ورودی دفترچه مهمان تغییر دهید.
چگونه میتوانم نوشتههای مهمان را قبل از انتشار، مدیریت کنم؟
برای مدیریت ورودیهای مهمان، میتوانید یک فیلد جدید به پایگاه داده خود اضافه کنید تا نشان دهد که آیا یک ورودی برای انتشار تأیید شده است یا خیر. وقتی یک ورودی جدید ارسال میشود، میتوان آن را به طور پیشفرض روی «تأیید نشده» تنظیم کرد. سپس میتوانید یک صفحه مدیریت ایجاد کنید که در آن بتوانید ورودیها را بررسی و تأیید کنید.
آیا میتوانم یک تابع جستجو به دفترچه مهمان خود اضافه کنم؟
بله، شما میتوانید یک تابع جستجو به دفترچه مهمان خود اضافه کنید. این کار را میتوان با اضافه کردن یک فرم جستجو به صفحه دفترچه مهمان و سپس تغییر کد خود برای فیلتر کردن ورودیهای دفترچه مهمان بر اساس معیارهای جستجو انجام داد. ASP.NET پشتیبانی داخلی برای پرسوجوهای پایگاه داده ارائه میدهد که میتوانید از آن برای پیادهسازی تابع جستجو استفاده کنید.
چگونه میتوانم از اطلاعات دفترچه مهمانم نسخه پشتیبان تهیه کنم؟
پشتیبانگیری از دادههای دفتر مهمان برای جلوگیری از از دست رفتن دادهها بسیار مهم است. میتوانید با خروجی گرفتن از پایگاه داده خود به یک فایل، از دادههای خود پشتیبان تهیه کنید. اکثر سیستمهای مدیریت پایگاه داده، از جمله SQL Server که توسط ASP.NET استفاده میشود، ابزارهایی برای خروجی گرفتن و وارد کردن پایگاههای داده ارائه میدهند.
آیا میتوانم از یک سیستم پایگاه داده متفاوت با ASP.NET استفاده کنم؟
بله، ASP.NET از چندین سیستم پایگاه داده پشتیبانی میکند. در حالی که SQL Server سیستم پایگاه داده پیشفرض است، میتوانید از MySQL، PostgreSQL، Oracle و موارد دیگر نیز استفاده کنید. برای استفاده از یک سیستم پایگاه داده متفاوت، باید رشته اتصال و احتمالاً برخی از پرسوجوهای پایگاه داده خود را تغییر دهید.
چگونه میتوانم دفترچه مهمان خود را برای دستگاههای تلفن همراه بهینه کنم؟
برای بهینهسازی دفترچه مهمان خود برای دستگاههای تلفن همراه، میتوانید از تکنیکهای طراحی واکنشگرا استفاده کنید. این شامل استفاده از طرحبندیهای انعطافپذیر، تصاویر انعطافپذیر و کوئریهای رسانهای CSS برای تنظیم طراحی بر اساس اندازه صفحه نمایش است. ASP.NET از طراحی واکنشگرا پشتیبانی میکند و منابع و آموزشهای آنلاین زیادی برای کمک به شما در پیادهسازی آن وجود دارد.
آیا میتوانم دکمههای اشتراکگذاری شبکههای اجتماعی را به ورودیهای دفترچه مهمان اضافه کنم؟
بله، میتوانید دکمههای اشتراکگذاری شبکههای اجتماعی را به ورودیهای دفترچه مهمان خود اضافه کنید. سرویسهای آنلاین زیادی وجود دارند که کد آماده برای دکمههای شبکههای اجتماعی ارائه میدهند. میتوانید به سادگی کد را کپی کرده و در صفحه دفترچه مهمان خود قرار دهید.
چگونه میتوانم عملکرد دفتر مهمان خود را بهبود بخشم؟
بهبود عملکرد دفتر مهمان شما میتواند شامل چندین استراتژی باشد، مانند بهینهسازی کوئریهای پایگاه داده، استفاده از ذخیرهسازی موقت (caching) و به حداقل رساندن اندازه فایلهای HTML، CSS و جاوا اسکریپت. ASP.NET پشتیبانی داخلی برای بسیاری از تکنیکهای بهینهسازی عملکرد ارائه میدهد.





ارسال نظر