0

ساخت یک سیستم نظرسنجی با callback در ASP.NET 2.0

 
amirpetrucci0261
amirpetrucci0261
کاربر طلایی1
تاریخ عضویت : تیر 1388 
تعداد پست ها : 27726
محل سکونت : http://zoomstar.ir/

ساخت یک سیستم نظرسنجی با callback در ASP.NET 2.0
چهارشنبه 10 آذر 1389  5:19 AM

ایجاد یک سیستم نظرسنجی در وب سایت شما این امکان را به شما می دهد که نظرات و علایق کاربرانتان را بدانید.من سعی می کنم در این مقاله نحوه ساخت یک سیستم نظرسنجی با تکنیک Ajax را که بوسیله callback ها پیاده سازی شده است را به شما نشان دهم.
طراحی بانک اطلاعاتی:
بانک اطلاعاتی تنها شامل دو جدول زیر است:
1. PollQuestions: این جدول حاوی تمام سوالات برای سیستم نظرسنجی می باشد.
2. PollChoices: این جدول شامل گزینه های انتخاب می باشد.
به شمای بانک در پایین نگاه کنید:
Stored Procedure

CREATE PROCEDURE usp_GetLastestPoll
AS
DECLARE @pqID int
SELECT @pqID = MAX(PollQuestionID) FROM PollQuestions
PRINT @pqID
SELECT q.PollQuestionID,q.[Text] AS PollText,c.PollChoiceID,
c.[Text] ChoiceText,c.Total FROM PollQuestions q JOIN PollChoices c
ON q.PollQuestionID = c.PollQuestionID WHERE q.PollQuestionID = @pqID
GO

معماری عملیات نظرسنجی:

من می خواهم که یک User Control نظرسنجی بسازم به طریقی که وابسته به صفحه و سایر اطلاعات آن نداشته باشد. به کلاس دیاگرام آن در زیر نگاه کنید:
اکنون اجازه دهید که جزییات هرکلاس را توضیح دهم:
IPoll<code>: Ipollیک اینترفیس است که توسط سایر کلاس های نظرسنجی استفاده می شود.
• WeeklyPoll: این کلاسی است که مسئول ایجاد نظرسنجی های هفتگی است.این کلاس اینترفیس IPoll را پیاده سازی می کند.
• PollQuestion: این کلاس موجودیت است که معادل اطلاعات جدول PollQuestions از بانک اطلاعاتی است.
• PollChoice: این یک کلاس موجودیت است که معادل جدول PollChoices از بانک اطلاعاتی است.
• PollTableHelper: این یک کلاس کمکی است که برای تولید داینامیک جداول HTML استفاده می شود.
ControlToHtmlConvertor: این کلاس شامل متد های کمکی برای تبدیل کنترل به HTML محض است.
DataAccess: این کلاس بعنوان DataAccess است و برای INSERT و SELECT کردن نظرسنجی ها از بانک اطلاعاتی استفاده می شود.

پیاده سازی:

اجازه بدهید به جزییات پیاده سازی بپردازیم.من چند کلاس مهم در این مقاله می بینم.شما می توانید از کد های زیر در این مقاله استفاده کنید:

IPollInterface

اینترفیس IPollInterface بوسیله همه کلاس ها یی که می خواهند عملیات نظرسنجی را انجام دهند پیاده سازی می شود.

public interface IPoll
{
string Create();
string GetStats();
}

WeeklyPoll

WeeklyPoll یکی از آن کلاس هایی است که اینترفیس IPool را پیاده سازی می کند.پیاده سازی بصورت زیر می باشد:

public class WeeklyPoll : IPoll
{
public string Create()
{
PollQuestion poll = PollQuestion.GetPoll();
return PollTableHelper.GenerateTableForPoll(poll);
}
public string GetStats()
{
PollQuestion poll = PollQuestion.GetPoll();
return PollTableHelper.GetPollStats(poll);
}
}

من نمی خواهم درباره کلاس PollTableHelper توضیح دهم چون ساده است و برای ساخت یک جدول بکار می رود. شما می توانید کد های همراه این مقاله را دانلود کرده و پیاده سازی کامل آن را مشاهده کنید:

PollControl.ascx

PollControl.ascx یک کنترل user control است که برای نمایش نظرسنجی به کاربر استفاده می شود. اجازه بدهید که نگاهی به کد های کنترل PollControl.ascx کنیم.


کد های Code Behind بصورت زیر است:

protected void Page_Load(object sender, EventArgs e)
{
RegisterCallbacks();
}
private void RegisterCallbacks()
{
string sbReference = Page.ClientScript.GetCallbackEventReference
(this, "arg", "ReceiveServerData", "context");
string cbScript = String.Empty;
// check if the script is already registered or not
if (!Page.ClientScript.IsClientScriptBlockRegistered("CallServer"))
{
cbScript = @" function CallServer(arg,context)
{ " + sbReference + "} window.setTimeout(CallServer,100); ";
Page.ClientScript.RegisterClientScriptBlock
(this.GetType(), "CallServer", cbScript, true);
}
}

من در کد های بالا یک callback را ایجاد کردم که به اسکریپت های جاوا اسکریپت اضافه می شود. اگر شما علاقه مند به داشتن اطلاعات بیشتر در باره اینکه چگونه می توانید callback به اسکریپت های صفحه خود اضافه کنید به این مقاله نگاه کنید.


همه چیز درباره رجیستر کردن (اضافه کردن) یک متد callback همان است بجز فراخوانی تابع window.setTimeout. من این تابع را فراخوانی کردم درنتیجه من می توانم متد CallServer را بلافاصله پس از رجیستر کردن آن در صفحه اجرا کنم.من می دانم که شما با خود فکر می کنید که چرا من بطور ساده CallServer('', '') را در انتهای فرایند رجیسترکردن تابع callback اجرا نکردم. متاسفانه این تکنیک هنگامی که CallServer در این صفحه آرگومان بگیرد، کار نمی کند.


برای اینکه callback کار کند، شما می بایست اینترقیس ICallbackEventHandler را بصورتی که در پایین نشان داده شده است،پیاده سازی کنید:

public partial class PollControl :
System.Web.UI.UserControl, ICallbackEventHandler

اینترفیس ICallbackEventHandler از دو متد به نام های GetCallbackResult و RaiseCallbackEvent تشکیل شده است.به پیاده سازی آن در پایین نگاه کنید:

public void RaiseCallbackEvent(string eventArgument)
{
// update the polls
string[] selection = eventArgument.Split(':');
if (selection.Length > 1)
{
PollQuestion.Update(Int32.Parse(selection[0]),
Int32.Parse(selection[1]));
// create a cookie for the user
CreatePollCookie();
}
}

رویداد RaiseCallbackEvent هنگامی اجرا می شود که کاربر نظر خود را انتخاب و دکمه نظر سنجی را کلیک کند.من چک می کنم که اگر کاربر گزینه ها را انتخاب کرده باشد، من نتایج انتخاب ها را در بانک اطلاعاتی بروز کنم.پس از بروز رسانی بانک اطلاعاتی همچنین من یک کوکی می سازم که کاربر قادر نباشد دفعات بعد دوباره نظر سنجی را انجام دهد.


من همچنین می توانم از آدرس IP برای تعیین اینکه آیا کاربر نظر خود را اعلام کرده و یا نه استفاده کنم ، اما استفاده از IP یک عیب دارد و آن اینست که اگر شخص در یک شبکه LAN پشت یک فایروال باشد، نظر وی نظر همه کاربران آن شبکه محسوب می شود.یعنی چون IP همه کاربران چنین شبکه ایی یکسان است، اگر یک کاربر از این شبکه نظر سنجی را انجام دهد سایر کاربران این شبکه نمی توانند در نظر سنجی شرکت کنند.


متد CreatePollCookie برا یایجاد یک HttpCookie بصورت زیر پیاده سازی می شود:

private void CreatePollCookie()
{
HttpCookie pollCookie = new HttpCookie("PollCookie");
pollCookie.Value = "PollCookie";
pollCookie.Expires = DateTime.Now.AddDays(7);
Response.Cookies.Add(pollCookie);
}

متد GetCallbackResult درست قبل از ارسال محتوا به کلاینت اجرا می شود.

public string GetCallbackResult()
{
string result = String.Empty;
IPoll poll = new WeeklyPoll();
if (DoesCookieExists())
{
result = poll.GetStats();
}
else
{
result = poll.Create();
}
return result;
}

متد DoesCookieExists مطمئن می شود که اگر کاربر قبلا نظر داده است، به او نتیجه نظرسنجی نمایش داده شود و درغبراینصورت نظرسنجی را به او نشان دهد.


این عمل با چک کردن کوکی های کاربر با این کد که آیا کوکی وجود دارد یا خیر انجام می گیرد:

private bool DoesCookieExists()
{
if (Request.Cookies["PollCookie"] != null) return true;
else return false;
}

کد های JavaScript

تمام کد های جاوا اسکریپت در یک فایل به نام Site.js قرار داده شده اند.تمام صفحات سایت که می خواهند از کنترل نظرسنجی استفاده کنند باید این فایل جاوا اسکریپت را به انها ضمیمه کنید.

function vote()
{
var pollWidget = document.getElementById("divPoll");
var inputElements = pollWidget.getElementsByTagName("INPUT");
var userSelection;
for(i=0; i<inputElements.length;i++)
{
if(isRadioButton(inputElements[i]))
{
if(inputElements[i].checked)
{
userSelection = inputElements[i].id;
break;
}
}
}
// call the server method to note the changes
CallServer(userSelection,'');
}
function ReceiveServerData(rValue)
{
document.getElementById("divPoll").innerHTML = rValue;
}
function isRadioButton(target)
{
return target.type == 'radio';
}

شما می توانید نمونه عملی این نظرسنجی را در اینجا قسمت بالا و راست این صفحه مشاهده کنید. 


تشکرات از این پست
دسترسی سریع به انجمن ها