ساخت یک سیستم نظرسنجی با callback در ASP.NET 2.0
چهارشنبه 10 آذر 1389 5:19 AM
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
معماری عملیات نظرسنجی:
پیاده سازی:
اجازه بدهید به جزییات پیاده سازی بپردازیم.من چند کلاس مهم در این مقاله می بینم.شما می توانید از کد های زیر در این مقاله استفاده کنید:
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';
}
شما می توانید نمونه عملی این نظرسنجی را در اینجا قسمت بالا و راست این صفحه مشاهده کنید.