Dot net In Blue

شنبه، اسفند ۰۶، ۱۳۸۴

View State آشنایی با

اگر حتی برنامه نویس دات نت هم نباشید و فقط به برنامه نویسی برای وب علاقه داشته باشید حتما در سرس صفحات دات نتی بارگزاری شده روی سیستمان (سرس صفحه *.aspx که توی مرورگر میبینید ) با یک چیز عجیب و غریب و بدرد نخود به صورت :

 

 < input type="hidden" name="__VIEWSTATE" value="dDwtMTI1MzE5Njg3NTt0PDtsPGk8MT47PjtsPHQ8O2w8aTwxPjtp =" />

 برخورد کرده اید این value که به نظر چرت و پرت هم میرسد گاهی بسیار طولانی میشود و چندین کیلوبایت فقط صرف این value نامفهوم میشود ، اما واقعا این چیست ؟؟ چرا باید باشد View State در حقیقت مجموعه ای از value های کنترل های داخل صفحه است !
 View State هیچ اطلاعاتی از سرور و کلاینت در خود نگهداری نمیکند و فقط تا زمانی وجود خواهد داشت که صفحه در مرورگر وجود دارد . مطمئنا هیچ انسانی نمیتواند از این string ای که به عنوان Valueبرای View State گذاشته میشود سر در بیاورد چون اطلاعات به صورت base64 کد شده اند و البته دقت میکنیم که کد شده اند و نه رمزنگاری ! base64 فقط کمک میکند تا رد بدل اطلاعات از طریق HTTP راحت تر باشد !
 خوب حالا این View State به چه درد میخورد ؟! تا به حال تعجب نکرده اید که چرا پس از ارسال صفحه به سرور و بازگشت آن اطلاعات کنترل های شما کماکان باقی میماند ؟؟ خوب کار، کار همین View State است ! مثلا برای ساختن یک دیتاگرید فقط یک بار به بانک اطلاعاتی مراجعه میکنید و آن را میسازید در روفت و آمد های بعدی همین View State است که به شما کمک میکند هربار مجبور نباشید به دیتابیس خود وصل شوید فقط وقتی که Page.IsPostback نیست باید این دیتاگرید یک بار و برای همیشه ساخته میشود !
 اما توجه کنید !درست است که درنظر اول این قضیه بسیار عالی به نظر میرسد ولی وقتی محتویات View State را در سرس صفحه میبینید شکه خواهید شد ! چرا این همه طولانی ؟!؟! خوب آن همه اطلاعات بالاخره باید ثبت شوند ! حالا فرض کنید که میدانید این صفحه فقط یک بار ساخته برای کاربر فرستاده میشود و دیگر رفت و برگشتی وجود نخواهد داشت که این همه اطلاعات به درد بخورد !
 آیا میشود از شر این مقدار سنگین برای View State راحت شد ؟؟ جواب بله است ! : تمام کنترل ها در دات نت سر انجام از کلاس Control مشتق میشوند ، به همین دلیل همه دارای property با عنوان EnableViewState هستند که به صورت پیش فرض true است با false نمودن این property شما میتوانید از داشتن View State برای آن کنترل صرف نظر کنید !
همینطور میتوانید درقسمت  بالای سرس  هر وب فرم این کار را انجام دهید:

<%@ Page ... EnableViewState="false" %>

اگر میخواهید از پایه در وبسایت خود این مقوله را غیر فعال کنید باید در web.config وارد کنید :

<pages enableViewState="false" />

 
 پس همیشه عاقلانه درباره EnableViewState تصمیم بگیرید. و ببینید کدام کفهه ترازو میچربد ؟ False یا True . View State چه type هایی را قبول میکند ؟ با آنکه View State برای type های محدودی پشتیبانی دارد خوشبختانه برای string, integer, boolean, ArrayLists و HashTable پشتیبانی در نظر گرفته شذه است .
View State حتی به شما این امکان را میدهد که اطلاعاتی را که میخواهید روی کلاینت ذخیره کنید ، طریقه این کار تقربا مشابهتی با Session State دارد ولی باید همیشه توجه کنیم که View State فقط تا وقتی اعتبار دارد که صفحه حاوی آن بسته نشده باشد !!!

ViewState ["SortOrder"] = "email"

در اینجا مقایسه ای بین View State و Session State به عمل آمده است .

View State Session State  
خیر بله استفاده از منابع سرور
ندارد 20 دقیقه  ( پیش فرض ) محدودیت زمانی
محدودیت ، پشتیبانی فقط  شامل :
strings, integers, Booleans, arrays, ArrayList, hashtable, custom TypeConverters
 
بله ذخیره سازی  تمام  type های دات نت
بله خیر طولانی کردن زمان لود صفحه

 

 آیا میتوان View State را رمز نگاری هم کرد ؟؟بله ، چرا که نه ! فقط دو قدم
 : 1) باید enableViewState="true" باشد

 2) باید machineKey validation type را به صورت 3DES تنظیم کنید به عبارت دیگر دو خط زیر را در web.config خود داشته باشید :

 < enableviewstate="true" enableviewstatemac="true"> < validation="3DES">

 

دنیای View State مانند تمام دنیا های دات نت در حوصله این وبلاگ نمی گنجد ، قصد فقط آشنایی بود ، ادامه مسیر با شما !