مقدمه:
همانطور که حتما می دانید یکی از روش هایی که زبان ASP.NET
برای حفظ حالت کنترل های خود استفاده می کند ViewState
می باشد (بدیهی است که منظور ما اینجا WebForm ها می
باشند و نه ASP.NET MVC).
با استفاده از قابلیت ViewState سهولت زیادی برای
توسعه گران برنامه های وب پدید آمده است و نیاز برنامه نویسان برای کار با اجزای
سطح پایینتر پرتکل HTTP از قبیل درخواست ها (Requests)
و جواب ها (Responses) را به شدت کاهش داده است.
محتویات ViewState با فرمت Base64
در درون یک کنترل HiddenField نگهداری می شود.
اما متاسفانه مشکل از اینجا آغاز می شود که در صفحاتی که تعداد کنترل ها زیاد
باشند و یا دارای کنترل های داده (DataControls) از قبیل
GridView و غیره باشند، حجم محتوای
ViewState به شدت بالا رفته و باعث کند شدن صفحات وب می شود. این موضوع حتی
در مواقعی تبدیل به یک کابوس برای برنامه نویسان می شود.
مشکل مربوطه به میزانی تاثیر گذار است که بسیاری از توسعه گران وب، قید استفاده
از این ویژگی وسهولت را زده و آن را به طور کامل غیر فعال می کنند و در نتیجه
خودشان با استفاده از روش ها و سیاست های دیگر نسبت به مدیریت حالت کنترل ها اقدام
می کنند و حتی معماری هایی هم برای این گونه طراحی به وجود آمده است. اما آن چه که
مشخص است این است که غیر فعال نمودن قابلیت ViewState در
مواقعی باعث بالارفتن حجم کدنویسی و زمان خواهد شد.
تیم ASP.NET در نسخه های مختلف این زبان، سعی نموده
اند که همواره بهبود هایی را برای این مشکل ایجاد نمایند و همواره توصیه نموده اند
که در مواقعی که استفاده از ViewState لازم نیست، حتما
این ویژگی را برنامه نویسان غیر فعال نمایند.
قابلیت ViewState را می توان در صفحات به شکل زیر غیر
فعال نمود.
<%@
Page
Language="C#"
EnableViewState="false"
%>
در نسخه ASP.NET 3.5 قابلیت جالبی برای غیر فعال
نموده این ویژگی ارائه شد. با استفاده از این ویژگی می توان در فایل
Web.Config این ویژگی را غیر فعال نمود. در اینصورت این
قابلیت در تمامی صفحات غیر فعال خواهد شد و دیگر
نیاز نیست در تک تک صفحات و کنترل ها قابلیت ViewState
را غیر فعال نمایید.
<pages enableViewState="false"></pages>
اما این ویژگی دارای نقصی نیز می باشد. بدین ترتیب که اگر در فایل
Web.Config این ویژگی را غیر فعال نمایید، دیگر قادر
نخواهید بود که در صفحاتی که به این ویژگی نیاز دارید، آن را فعال نمایید!
مشکل دیگری که در این میان وجود داشت این بود که کنترل ها قابلیت
ViewState خود را از والد (Parent)
خود به ارث می برند. یعنی اگر این قابلیت در یک صفحه (Page)
غیر فعال شود، دیگر نمی توان در سایر کنترل های صفحه این ویژگی را فعال نمود. به
طور مثال ممکن است که شما نیز داشته باشید ویژگی ViewState
فقط برای یکی از کنترل های صفحه فعال باشد که این موضوع امکان پذیر نبود.
روش دیگر این بود که ویژگی ViewState را برای صفحه
فعال نموده و سپس برای تک تک کنترل ها فعال یا غیر فعال کنیم که خود این موضوع نیز
مشکلاتی را در پی داشت.
آغاز:
اما ویژگی جالبی که در ASP.NET 4 معرفی شده است
ViewStateMode می باشد که اکنون به معرفی آن می پردازیم.
اگر به دقت به کنترل های موجود نگاه کنید، متوجه خواهید شد که علاوه بر ویزگی
EnableViewState یک ویژگی جدید به نام
ViewStateMode نیز اضافه شده است.
با استفاده از این ویژگی می تواند قابلیت ViewState
را در یک صفحه (و یا یک کنترل والد مانند Panel) غیر فعال نمود در حالیکه در کنترل های موجود در صفحه فعال می باشد.
ویژگی ViewStateMode می تواند شامل مقادیر زیر باشد:
- Inhert: این مقدار به صورت پیشفرض برای این
ویژگی در نظر گرفته شده است و بدین معنی می باشد که قابلیت
ViewState در این کنترل از والد آن به ارث برده می شود. این ویژگی دقیقا
همان حالتی است که تاکنون در نسخه های مختلف زبان ASP.NET
وجود داشته است.
- Disabled: اگر مقدار ویژگی
ViewStateMode برابر Disabled باشد، ویژگی ViewState
برای این کنترل غیر فعال می باشد
- Enabled: اگر مقدار ویژگی
ViewStateMode برابر Enabled باشد، ویژگی
ViewState برای این کنترل فعال می باشد. حتی اگر این
قابلیت برای کنترل والد و حتی خود صفحه نیز Disabled
شده باشد، باز هم ویژگی ViewState برای این کنترل
فعال می باشد.
تذکر مهم:
هنگام استفاده از ویژگی ViewStateMode حتما باید
ویژگی EnableViewState فعال باشد. به طور مثال اگر ویژگی
EnableViewState را برای یک صفحه غیر فعال کنید، دیگر
قابلیت ViewStateMode برای آن صفحه و کنترل های موجود در
آن کاملا بلااثر خواهد بود.
در قسمت زیر مثالی را ملاحظه می نمایید که قابلیت
ViewStateMode برای صفحه غیر فعال شده است و برای یکی از کنترل های موجود در
آن فعال.
<%@
Page
Language=
"C#"
ViewStateMode="Disabled"
%><asp:TextBox
ID="TextBox1"
runat="server"
ViewStateMode="Enabled"
></asp:TextBox>