0

بررسی Postback در Asp.NET

 
mohamadaminsh
mohamadaminsh
کاربر طلایی1
تاریخ عضویت : دی 1389 
تعداد پست ها : 25772
محل سکونت : خوزستان

بررسی Postback در Asp.NET

 

واحد دانش و تکنولوژی تبیان زنجان

در این مقاله یکی از مهمترین مفاهیم ASP.NET یعنی Postback را مورد بررسی قرار خواهیم داد .

با یک مثال ساده Postback را به شما معرفی می کنم ، فرض کنید وارد یک سایت می شوید که یک فرم ثبت نام ساده دارد ، فرم را پر می کنید و روی دکمه تایید کلیک می کنید ، چه اتفاقی می افتد ؟

گویا صفحه به صورت خودکار یک بار Refresh میشود ، این کار باعث میشود اطلاعات داخل صفحه (مقادیری که شما در فرم وارد کرده اید) به سرور منتقل شود ، سرور عملیات مورد نظر را روی این اطلاعات انجام می دهد و سپس نتیجه کار (مثلا پیام موفقیت آمیز بودن ثبت نام) به شما نمایش داده خواهد شد ، این عمل یعنی ارسال صفحه به سرور و بازگشت دوباره آن را Postback می نامیم .

اکنون سوال اینجاست که چه نیازی بود صفحه Postback شود ؟ پاسخ این سوال به فهم شما از نحوه عملکرد Asp.NET بر میگردد ، همانطور که توضیح دادیم IIS و موتو Dotnet یا Asp.net runtime در سرور قرار دارند ، برای همین اگر بخواهید کدهایی که نوشتید بر روی فرم اثر کنند این فرم باید برای سرور ارسال شود و در نهایت دوباره به سمت مشتری (کلاینت) بازگردد .

من توضیحات نحوه عملکر را از مقاله اول دوباره ذکر میکنم :

وقتی درخواست نمایش صفحه Register.aspx (یا هر صفحه aspx دیگر ) از طرف مروگر به سرور (IIS) صادر می شود ابتدا IIS چک می کند که این صفحه متعلق به کدام Engine است ، وقتی متوجه شد که این صفحه مربوط به Asp.NET است آن را برای ترجمه به DotnetFramework ارائه می کند ، دات نت فریم ورک تمامی کد های لازم را ترجمه می کند (کد های سمت سرور به زبان ویژوال بیسیک و سی شارپ و همچنین تگ های دارای Runat=Server) و در نهایت خروجی را به صورت HTML به IIS تحویل داده و IIS آنرا به مرورگر شما می فرستد . دقت بفرمایید که کدهای Visual Basic به HTML تبدیل نمی شوند بلکه نتیجه تغییرات شما که توسط کدهای ویژوال بیسیک داده شده است به صورت HTML ارائه می گردد .

 اکنون به تصویر زیر دقت نمایید :

تبیان زنجان

در تصویر فوق در سمت چپ صفحه مروگر در کامپیوتر Client باز شده است ، چه وقتی کاربر برای اولین بار یک وب سایت را باز می کند ، چه کاربر با یک عمل باعث Postback بشود چرخه فوق اجرا خواهد شد .

درخواست بر روی پروتوکل Http به سرور منتقل می شود، سرور درخواست را به IIS داده و IIS آنرا توسط Asp.net runtime یا همان dotnet framework ترجمه می کند ، سپس نتایج کار یا page response به IIS برگشته و سپس تحویل Client می شود .

اکنون این چرخه را به صورت عملی تست می کنیم ، یک پروژه Asp.net باز نمایید ، یک صفحه جدید به نام مثلا TestPostback.aspx اضافه نموده یک کنترل button و یک label در آن قرار دهید .

روی Button دابل کلیک نموده تا صفحه کد نویسی (اصطلاحا به این صفحه Code Behind هم می گوییم) شویم ، داخل بلاک مربوط به کلیک شدن باتن یک متن به خاصیت Text کنترل Label تخصیص می دهیم :

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Label1.Text = "Test Postback"

End Sub

اکنون صفحات را Save کرده و این صفحه را در مرورگر باز نمایید ، وارد View Source شوید ، کد مربوط به Label1 در سورس HTML شما مشابه کد زیر خواهد بود :

<span id="Label1">Label</span>

اکنون صفحه View source را بسته و روی Button کلیک نمایید (به رفت و برگشت صفحه که خیلی سریع اتفاق می افتد دقت نمایید) ، دوباره صفحه View Source را باز کنید ، به تغییراتی که در سورس اتفاق افتاده دقت نمایید :

<span id="Label1">Test Postback</span>

بله همانطور که ملاحظه می کنید مقدار تگ span با آیدی Label1 تغییر کرده است .

اتفاقی که افتاده این است که هنگامی که شما روی دکمه کلیک کردید صفحه postback شده است (نام صفحه و کنترلی که باعث Postback شده است نیز از طریق پروتوکل http به سرور معرفی می شود) ، با این اتفاق صفحه به IIS منتقل شده و IIS این صفحه را به Asp.net runtime هدایت می کند ، در این بخش صفحه کدنویسی منتاظر با این صفحه پیدا می شود ، موتور Asp.net کنترلی که باعث Postback شده است را دریافت کرده و به دنبال بلاک کد مربوط به این کنترل می گردد ، سپس کدهای مربوط به این بلاک را اجرا می کند ، این کدها باعث تغییرات در صفحه می شوند بنابراین صفحه را تغییر داده و نتیجه را به صورت HTML دوباره به کلاینت ارسال می کند .

اکنون یک تست دیگر را انجام می دهیم ، وارد بخش Design بشوید یک Button دیگر نیز به صفحه اضافه کنید و روی آن کلیک راست کرده گزینه Properties را انتخاب نمایید سپس خاصیت Text آن را به Button2 تغییر دهید ،سپس این بار بر روی خود صفحه (یک بخش خالی صفحه ) دابل کلیک کنید تا بلاک زیر برای شما نمایش داده شود :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

End Sub

داخل این بلاک یک متن به Label1 اختصاص دهید :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Label1.Text = "Before Postback"

End Sub

اکنون صفحات را Save کرده و صفحه مذکور را در مرورگر اجرا کنید ، نتیجه قبل از کلیک شدن بر روی باتن به صورت زیر است :

<span id="Label1">Before Postback</span>

صفحه View Source را ببندید اکنون بر روی دکمه اول کلیک نمایید و دوباره صفحه View Source را بگشایید ، همانطور که انتظار می رفت متن به صورت زیر تغییر کرد :

<span id="Label1">Test Postback</span>

اکنون صفحه View Source را بسته و این بار بر روی Button2 کلیک نمایید ، اگر به View Source دقت نمایید متوجه می شوید که متن داخل Label1 به متن اولیه یعنی "Before Postback" برگشته است ، دلیل این اتقاق چیست ؟

نکته اینجاست که هنگامی که صفحه Postback می شود قبل از اینکه موتور Asp.net به سراغ کنترلی که باعث postback شدن برود ابتدا رویداد Page_load را اجرا می کرده و سپس کد های مربوط به کنترل مورد نظر را اجرا می نماید و چون ما برای Button2 کدی ننوشتیم (در حقیقت تنها وظیفه این باتن Postback کردن صفحه است) فقط Page_load اجرا شده است .

اگر نخواهیم در هر بار Postback شدن کدهای Page_load اجرا شود باید از یک شرط استفاده کنیم :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

If Not IsPostBack= Then

Label1.Text = "Before Postback"

End If

End Sub

کد فوق به سیستم می گوید : "اگر تا کنون هیچ Postback ای اتفاق نیفتاده است این کار را انجام بده ..." ، بنابراین این کد فقط در بار اول که صفحه لود می شود اجرا خواهد شد

اکنون صفحات را Save کرده و تست دوم را مرحله به مرحله دوباره تکرار کنید ، مشاهده می کنید که با کلیک بر روی Button2 متن به حالت اول بر نخواهد گشت .

 توضیحات اضافه در مورد شرط فوق :

در کد فوق شما با ساختار شرط ها هم آشنا شدید ، یک شرط با کلمه If شروع شده سپس شرط مورد نظر ذکر می شود و عملیات مورد نظر ما در صورت برقراری شرط بعد از کلمه Then نوشته می شود و در نهایت با End if خاتمه می یابد .

در اینجا شرط ما Not IsPostback بوده ، که کلمه Not برای منفی کردن IsPostback آمده است ، اگر کمه Not را حذف کنید کد مربوطه در هر بار Postback شدن اجرا خواهد شد که برخلاف خواسته ما می باشد

البته شرط فوق را به شکل زیر هم میتوان نوشت :

If IsPostBack = False Then

Label1.Text = "Before Postback"

End If

چرا که مقدار تابع IsPostBack یک Boolean بوده یعنی فقط مقدار True یا False قبول می کند .

کریمی که جهان پاینده دارد               تواند حجتی را زنده دارد

 

دانلود پروژه و کارآموزی و کارافرینی

جمعه 22 اردیبهشت 1391  10:17 PM
تشکرات از این پست
دسترسی سریع به انجمن ها