سه شنبه ۲۸ دی ۱۳۹۵
 
 
 
کلمه عبور خود را فراموش کرده اید؟
 

 
 
 مدیریت State Management در ASP.NET
ASP.NET
تاریخ ثبت:  ۹۴/۲/۱۶
تعداد نمایش:  ۱۴۰۹
  نویسنده: مرتضی طالب پور
 
   ۴  نفر تا این لحظه به این مقاله امتیاز داده اند.
 
   Bookmark and Share

کاربرد View State

يكی از مهمترين تفاوت های موجود بين برنامه های وب و Desktop، مديريت state است كه در آن می بايست به اين پرسش پاسخ داده شود كه نحوه نگهداری اطلاعات در ارتباط با كاربر جاری به چه صورت است؟

وب ماهیتی Stateless دارد به این معنی که با هر بار درخواست بارگذاری یک صفحه متغیرها، مقدار قبلی خود را از دست می دهند.

در يك برنامه سنتی ويندوز، State به طور اتوماتيك مديريت می گردد. حافظه به حد فراوان يافت می شود و همواره در دسترس است. در برنامه های وب داستان به گونه ای ديگر است. هزاران كاربر ممكن است به طور همزمان برنامه ای مشابه را بر روی كامپيوتری يكسان (سرويس دهنده وب) اجراء و هر يك از آنان از طريق پروتكل HTTP ( برگرفته شده از  Hypertext Transfer Protocol) كه دارای ماهيتی Stateless است با سرويس دهنده وب ارتباط برقرار نمايند. مجموعه شرايط فوق باعث شده است كه نتوان برنامه های وب را با سناريوئی دقيقاً مشابه با برنامه های سنتی ويندوز طراحی و پياده سازی كرد.

View State  برای ذخیره مقادیر متغیرها در یک صفحه واحد کاربرد دارد. این امکان، امکانی سمت کلاینت است.

هيچ گونه فريمورك برنامه نويسی وب، صرف نظر از ميزان پيشرفته بودن آن، نمی تواند ماهيت Stateless بودن پروتكل HTTP را تغيير دهد. پس از هر درخواست و پاسخ به آن، ارتباط منطقی سرويس گيرنده با سرويس دهنده قطع خواهد شد. معماری فوق، اين اطمينان را ايجاد می نمايد كه برنامه های وب بتوانند به هزاران كاربر بطور همزمان و بدون نگرانی در خصوص حافظه پاسخ دهند. استفاده از روش های مختلف برای ذخيره اطلاعات بين درخواست های متعدد يك كاربر و بازيابی آنها در زمانی كه به آنها نياز است از جمله مشكلات معماری فوق برای پياده كنندگان برنامه های وب محسوب می گردد. آشنائی و درك مناسب نسبت به محدوديت های  State، يكی از مفاهيم كليدی در زمان ايجاد برنامه های وب كارآ و قدرتمند است.
در مجموعه مقالاتی كه در اين خصوص آماده و به تدريج منتشر خواهد شد به بررسی موارد زير خواهيم پرداخت:

  • آشنائی با مفاهيم، جايگاه و لزوم مديريت state در برنامه های وب
  • آشنائی با پتانسيل های ارائه شده در ASP.NET 2.0 برای ذخيره سازی و مديريت اطلاعات
  • آشنائی با گزينه های متفاوت موجود به منظور مديريت State نظير View State، Session State، كوكی های سفارشی 
  • نحوه انتقال اطلاعات از يك صفحه به صفحه ديگر

مديريت State و مسائل در ارتباط با آن

در يك برنامه سنتی ويندوز، كاربران با يك برنامه در حال اجراء به طور پيوسته ارتباط برقرار می نمايند. بخشی از حافظه موجود بر روی كامپيوتر Desktop  برای ذخيره  تنظيمات جاری اطلاعات محيط كار كاربر اختصاص داده می شود.

در يك برنامه وب، داستان كاملاً متفاوت است. شايد از ديد كاربران يك سايت حرفه ای اينگونه برداشت شود كه يك برنامه به طور مستمر در حال اجراء است و به آنان سرويس های لازم را می دهد. علیرغم اينكه ظاهر موضوع درست به نظر می آيد ولی در پس پرده داستان بگونه ای ديگر دنبال می شود. برنامه های وب از يك الگوی دستيابی غيرمتصل كارآ استفاده می نمايند. در اين الگو، سرويس گيرنده پس از ارتباط با سرويس دهنده از آن درخواست يك صفحه را می نمايد. پس از پاسخ به سرويس گيرنده، ارتباط منطقی ايجاد شده قطع و سرويس دهنده بی خيال هرگونه اطلاعاتی در رابطه با سرويس گيرنده می گردد. پس از دريافت صفحه درخواستی توسط سرويس گيرنده، برنامه اجراء خود را متوقف و ASP.NET Engine اشياء مربوط به صفحه را دور می اندازد. با توجه به اينكه سرويس گيرندگان لازم است در اكثر موارد صرفا" برای چندين ثانيه متصل باشند، يك سرويس دهنده وب می تواند به هزاران درخواست با كارآئی مطلوب پاسخ دهد. در صورتی كه لازم است اطلاعات بين چندين عمليات كاربر نگهداری شوند، می بايست از راهكارهای مختلفی به منظور مديريت State استفاده كرد.

View State:

همانگونه كه اطلاع داريد كنترل های سرويس دهنده ASP.NET از View State برای به خاطر سپردن State استفاده می نمايند. اطلاعات View State در يك فيلد مخفی نگهداری شده و به طور اتوماتيك پس از هر PostBack برای سرويس دهنده ارسال می گردد. View State محدود به كنترل های سرويس دهنده نمی گردد و در صورت ضرورت می توان مجموعه ای از اطلاعات مورد نياز را مستقيماً در مجموعه View State ذخيره تا امكان بازيابی آنها پس از هر PostBack فراهم شود. نوع های مختلفی را می توان در View State ذخيره نمود. نوع های داده ساده و اشياء سفارشی نمونه هائی در اين زمينه می باشند.

خصلت ViewState صفحه، مجموعه View State را ارائه می نمايد. اين خصلت يك نمونه از كلاس مجموعه StateBag است. برای اضافه كردن و حذف آيتم هائی در اين كلاس، از گرامری مشابه با يك ديكشنری استفاده می گردد كه در آن هر آيتم دارای يك نام منحصر بفرد  است. كد زير نحوه استفاده از view state را نشان می دهد.

 

    (protected void Page_Load(object sender, EventArgs e

    }

        (if (ViewState["Name"] == null   

        }   

            ;()TextBox1.Text = a.ToString      

            ;(ViewState.Add("Name", TextBox1.Text      

        {   

    {

کد بالا مشخص می کند که اگر عنصر Name از ViewState برابر خالی بود؛ به عنصر Name از ViewState مقدار TextBox1 را پاس بده. دستور فوق، مقدار TextBox1 را در مجموعه View State قرار می دهد.


برای بازيابی آيتم های ذخيره شده در View State از نام نسبت داده شده به هر يك از آنها استفاده می گردد. همچنين، لازم است كه مقدار بازيابی شده را با استفاده از گرامر Casting به نوع داده مناسب تبديل نمود چرا كه مجموعه ViewState تمامی آينم ها را به عنوان اشياء عام ذخيره می نمايد تا بتواند با نوع های داده مختلف سرو كار داشته باشد.  

در صورت عدم وجود اطلاعات مورد نظر در view state با يك NullReferenceException مواجه خواهيم شد. بنابراين، لازم است كه همواره قبل از بازيابی و تبديل داده ذخيره شده در view state از وجود آن در ساختار فوق اطمينان حاصل نمود. برای آشنائی بيشتر با نحوه بكارگيری View State در برنامه های وب به بررسی يك نمونه مثال كاربردی خواهيم پرداخت.

(protected void Button1_Click(object sender, EventArgs e

    }

        // خواندن از ویو استیت        

        ;()string S = ViewState["Name"].ToString    

        ;(a = int.Parse(S    

        //اضافه کردن        

        ;++a    

             //ViewState.Add("Name", a.ToString());    

        ;(()ViewState.Add("Name", a.ToString    

        ;()TextBox1.Text = a.ToString    

    {

 

مثال: ثبت تعداد دفعاتی كه بر روی يك دكمه كليك می گردد

كد زير يك برنامه ساده شمارنده را نشان می دهد كه در آن تعداد دفعاتی كه بر روی يك دكمه كليك می شود تشخيص داده شده و تعداد آن در خروجی نمايش داده می شود . بدون استفاده از يك راهكار مناسب برای مديريت State، شمارنده به طور دائم عدد 1 را در خروجی نشان خواهد داد.

 

;int a = 0

 

    (protected void Page_Load(object sender, EventArgs e

    }

        (if (ViewState["Name"] == null

        }

            ;()TextBox1.Text = a.ToString

            ;(ViewState.Add("Name", TextBox1.Text

        {

    {

   

    (protected void Button1_Click(object sender, EventArgs e

    }

        // خواندن از استت ویوو      

        ;()string S = ViewState["Name"].ToString   

        ;(a = int.Parse(S   

        //اضافه کردن به شمارنده      

        ;++a   

             //نوشتن در استت ویو   

        ;(()ViewState.Add("Name", a.ToString   

        ;()TextBox1.Text = a.ToString   

    {


در كد فوق قبل از تلاش برای بازيابی آيتم مورد نظر  از
View State، وجود آن در ساختار فوق بررسی می گردد .  شكل زیر خروجی برنامه فوق را نشان می دهد.


استفاده از
View State برای نگهداری مقدار Counter

برای حل مسئله مديريت State در مثال فوق و نگهداری مقدار  Counter در بين چندين PostBack از روش هائی ديگر نيز می توان استفاده كرد. به عنوان مثال، می توان برای كنترل سرويس دهنده Label ويژگی View State را فعال و از label برای ذخيره مقدار Counter استفاده نمود. هر مرتبه كه بر روی دكمه "افزايش شمارنده " كليك گردد، مقدار جاری از طريق خصلت Text كنترل Label بازيابی و پس از تبديل به يك عدد صحيح در خروجی نمايش داده می شود.

از روش فوق نمی توان همواره به عنوان يك راهكار مناسب استفاده كرد. مثلاً ممكن است قصد ايجاد برنامه ای را داشته باشيم كه تعداد دفعاتی را كه بر روی يك دكمه كليك می گردد ثبت نمايد ولی قصد نمايش نتايج را در خروجی نداشته باشيم.در چنين مواردی می توان همچنان اطلاعات را در يك كنترل سرويس دهنده ذخيره نمود ولی مجبور خواهيم بود كه آن را مخفی نگاه داريم.
پس از انجام تمامی اين كارها، به چيزی می رسيم كه
View State  آن را در اختيار ما قرار می دهد. View State، اطلاعات را به طور اتوماتيك در يك فيلد مخفی خاص در صفحه نگهداری می نمايد. با توجه به اينكه ASP. NET با جزئيات اين كار سروكار دارد، كد نوشته شده توسط پياده كنندگان از خوانائی بيشتری برخوردار خواهد بود. در بخش دوم به بررسی نحوه ايمن سازی اطلاعات ذخيره شده در view state خواهيم پرداخت.

فایل ضمیمه مقاله: persiadevelopers_01.rar
  کیفیت مقاله ارائه شده از نظر شما   
برای دادن رتبه به این مقاله می بایست Login کرده باشید.
  درباره نویسنده
مرتضی طالب پور
همه مقاله های نوشته شده توسط این کاربر (۱)
 
  پیام جدید
هیچ سؤال یا نظری برای این موضوع فرستاده نشده است.

 عنوان فرستنده تاریخ

Copyright © 2006 - 2016 All Rights Reserved.
Please direct your questions or comments to