آموزش ASP.Net > مدیریت وضعیت State در ASP.Net

 آموزش کار با بر شی View State در ASP.Net

مقدمه :

یک برنامه وب نامعتبر و غیر قابل اطمینان است . هربار که صفحه به سرور ارسال ( Post ) می شود ، نسخه جدیدی از صفحه ساخته خواهد شد . این مسئله می تواند به معنای از بین رفتن اطلاعات موقتی صفحه و کنترل های درون آن باشد . برای مثال فرض کنید کاربر اطلاعاتی در یک کادر متن وارد نموده و آنها را همراه صفحه به سرور ارسال کند . اما اطلاعات وارد ممکن است در بازگشت از سرور گم شده یا از بین بروند . برای حل این مشکل  سنتی در برنامه نویسی وب ، Asp .Net چندین روش و امکان را برای ذخیره اطلاعات صفحه و کنترل های آن در اختیار ما قرار داده که یکی از آنها خاصیت View State است . بصورت پیش فرض Asp.Net از View State برای ذخیره اطلاعات صفحه و کنترل های آن استفاده می کند . هنگامی که کد HTML صفحه تولید می شود ، وضعیت جاری آن ( State ) و مقادیر موجود در کنترل هایی که باید بعدا مورد استفاده قرار بگیرند ، در رشته های متنی 64 بیتی انکد شده و در یک یا چندین کنترل Hidden Field ذخیره می شوند . شما می توانید به شی View State در صفحات Asp.Net از طریق خاصیت View State دسترسی داشته باشید . این شی اطلاعات را بصورت جفت های نام / مقدار درون خود نگهداری می کند .

برای پی بردن به اینکه چه زمانی از شی View State استفاده نمایید به بخش تفاوت های اشیای ذخیره اطلاعات در Asp.Net بروید . همچنین می توانید به وسیله کلاس PageStatePersister ، نحوه عملکرد این شی و منبع داده ای که اطلاعات در آن ذخیره می شوند را تغییر دهید .

نکات قابل توجه در استفاده از شی View State :

شی View State می تواند اطلاعات صفحه جاری را نگهداری کند . اگر شما می خواهید اطلاعات را در بیش از یک صفحه نگهداری کرده و یا در سیکل کلی حرکت در سایت استفاده نمایید ، بایستی از سایر اشیای ذخیره داده Asp.Net مثل Session State استفاده نمایید .برای دریافت اطلاعات بیشتر به صفحه آموزش انتقال اطلاعات بین صفحات Asp.Net بروید .
نکته بعدی اینکه اطلاعات View State به زبان XML انکد شده و در متغیرهای متنی با فرمت 64 بیتی ذخیره می شوند که می توانند حجم بالایی از اطلاعات را تولید کنند . این اطلاعات همراه با کدهای صفحه به سرور ارسال می شوند . اگر حجم اطلاعات خیلی زیاد باشد ، می تواند کارایی صفحه و سرور را پایین آورد . بنابراین حتما یکبار صفحه را با حداکثر اطلاعات ممکن به سرور ارسال نموده و دقت نمایید که آیا کارایی صفحه پایین می آید یا خیر .
نکته بعدی نیز اینکه اگر حجم اطلاعات موجود در کنترل های Hidden Field از یک حجم خاصی بیشتر باشد ، برخی فایروال ها و برنامه های پروکسی ، از دسترسی به این صفحات جلوگیری می کنند ، که این مسئله می تواند مشکلات زیادی را ایجاد نماید .
اگر حجم اطلاعاتی که درون شی View State قرار می گیرد ، بیش از حد تعیین شده در خاصیت MaxPageStateFieldLength باشد ، این شی اطلاعات را به بخش های کوچکتری تقسیم کرده و هر بخش را درون یک کنترل Hidden Field قرار می دهد . در این صورت برنامه های فایروال نیز امکان عبور اطلاعات صفحه را خواهند داد . خاصیت View State برای تمامی کنترل ها بصورت پیش فرض فعال است اما ممکن است برخی کنترل ها نیازی به فعال بودن این خاصیت نداشته باشند . برای مثال ، کنترل های داده مثل GridView که حجم اطلاعات بالایی از یک پایگاه داده را نمایش می دهند ، نباید View State فعال داشته باشند .
شما می توانید صفحه را به گونه ای تنظیم نمایید که خاصیت View State برای تمامی کنترل های آن غیر فعال باشد ، سپس کنترل هایی که می خواهید اطلاعات آنها ذخیره شود را فعال کنید . برای غیر فعال نمودن خاصیت View State در یک صفحه ، مقدار خاصیت ViewStateModeآن را در بخش اعلان صفحه ( Page@ ) برابر با Disable قرار دهید . همین کار را برای غیر فعال نمودن خاصیت ViewStateMode در یک کنترل نیز می توانید انجام دهید . کدهای نمونه زیر ، نحوه انجام این کار را نشان می دهد :

کد صفحه <%@ Page Title=" "  ViewStateMode="Disabled" Language="C#" MasterPageFile="~/App_Data/ASP_Master.master" AutoEventWireup="true" ...

کد کنترل <asp:AdRotator ViewStateMode = "Disabled" runat ="server" ...

نکته : برخی دستگاه های موبایل و سیستم عامل های تحت موبایلی ، بطور کل اجازه کار به کنترل های Hidden Field نمی دهند . بنابراین خاصیت View State بطور کامل کار نمی کند . برای دریافت اطلاعات بیشتر به بخش طراحی سایت های Asp.Net برای دستگاه های موبایل بروید .

Control State :

علاوه بر ASP.Net ، View State از شی دیگری برای نگهداری اطلاعات کنترل ها بر روی صفحه پشتیبانی می کند . صفحه از شی Control State برای ذخیره اطلاعات کنترل هایی که باید اطلاعات آنها در جریان رفت و برگشت به سرور ، حفظ شوند ، حتی اگر خاصیت View State برای آنها غیرفعال شده باشد ، استفاده می کند . همانند View State ، اطلاعات Control State نیز درون کنترل های Hidden Field قرار می گیرند .

ذخیره مقادیر در View State :

شما می توانید اطلاعات ذخیره شده در شی View State صفحه را بوسیله خاصیت ViewState آن خوانده و ذخیره نمایید . به دلیل اینکه اطلاعات شی View State بصورت کنترل های Hidden Field به سرور ارسال می شوند ، تا قبل از پایان یافتن متد PreRenderComplete ، می توانید اطلاعات این شی را ویرایش نمایید . اما بعد از رندر شدن صفحه به مرورگر ، دیگر امکان ایجاد تغییر در اطلاعات آن وجود ندارد . همچنین ، همانطور که در بخش های قبل اشاره کردیم ، اطلاعات ذخیره شده در کنترل های Hidden Field ، چنانچه کاربر به بخش View State در مرورگر برود ، قابل مشاهده هستند ( با وجود اینکه خروجی ظاهری بر روی صفحه ندارند ) . لذا اطلاعات حساس را بصورت عادی توسط این خاصیت نمی توان منتقل کرد .
در ادامه همین بخش ، در قسمت مطمئن کردن View State به آموزش نحوه رمزنگاری اطلاعات خواهیم پرداخت .

مثال عملی کار با View State :

مثال عملی زیر نحوه طراحی یک صفحه Asp.Net با کدهای لازم جهت ذخیره دو مقدار integer و string در شی View State را نشان می دهد . به کد دقت نمایید ، سپس به تشریح نکات آن خواهیم پرداخت .

C# کد <%@ Page Language="C#" %>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">
      // ایجاد یک متغیر آرایه در صفحه
      ArrayList PageArrayList;

      ArrayList CreateArray()
        {
          // ایجاد یک آرایه نمونه
          ArrayList result = new ArrayList(4);
          result.Add("item 1");
          result.Add("item 2");
          result.Add("item 3");
          result.Add("item 4");
          return result;
        }


      void Page_Load(object sender, EventArgs e)
        {
            if (ViewState["arrayListInViewState"] != null)
            {
                PageArrayList = (ArrayList)ViewState["arrayListInViewState"];
            }
        else
            {
              // ArrayList isn't in view state, so it must be created and populated.
              PageArrayList = CreateArray();
            }
            // استفاده می کند PageArrayList  کدی که از آرایه
        }


      void Page_PreRender(object sender, EventArgs e)
        {
           // را ذخیره نمایید PageArrayList  قبل از اینکه صفحه رندر شود ، آرایه
           ViewState.Add("arrayListInViewState", PageArrayList);
        }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head id="Head1" runat="server">
  <title>View state sample</title>
  </head>
  <body>
    <form id="form1" runat="server">
        <div>
        </div>
    </form>

  </body>
</html>

انواع داده هایی که می توانید در شی View State ذخیره کنید ، شامل لیست زیر هستند :

  • Strings
  • Integers
  • Boolean values
  • Array objects
  • ArrayList objects
  • Hash tables

خواندن اطلاعات موجود در یک View State :

برای این کار ابتدا شی View State صفحه را فراخوانی کرده و سپس مقدار مورد نظرمان را از مجموعه مقادیر آن می خوانیم .
مثال عملی : مثال زیر نشان می دهد که چگونه شی آرایه ای Array List با نام ArrayListInViewState صفحه خوانده و سپس با ارسال آن به یک کنترل GridView نمایش دهید . مقادیر شی View State در فرمت متغیر String ذخیره می شوند . در VB اگر شما مقدار خاصیت OptionString را بر روی On تنظیم کرده باشید ، باید مقدار مورد نظر خود را به نوع داده ای مناسب تبدیل نموده تا بتوانید استفاده نمایید . مانند مثال های قبلی .
همچنین در #C باید مقدار مورد نظر خود را به مقدار مناسب تبدیل نموده تا قابل استفاده باشد .

VB کد Dim arrayList As ArrayList
arrayList = CType(ViewState("arrayListInViewState"), ArrayList)

Me.GridView1.DataSource = arrayList
Me.GridView1.DataBind()
C# کد arrayList = new ArrayList();
arrayList = (ArrayList)ViewState["arrayListInViewState"];

this.GridView1.DataSource = arrayList;
this.GridView1.DataBind();

نکته آخر : اگر شما سعی کنید محتوی یک شی View State را که وجود ندارد ، بخوانید ، Error ای در برنامه رخ نمی دهد . برای عملکرد بهتر کد خود ، ابتدا به وسیله کدی همانند کد زیر امتخان کنید که آیا مقدار مورد نظرتان در شی View State وجود دارد یا خیر .

VB کد If ViewState("color") Is Nothing Then
   ' در صفحه اجرا شود  View State  کدی که می خواهیم در صورت نبودن شی
End If
C# کد if (ViewState["color"] == null)
   //  در صفحه اجرا شود  View State  کدی که می خواهیم در صورت نبودن شی


راجع این مطلب سوال یا اشکالی دارید ؟! آن را در انجمن سایت مطرح نمایید ...         >>>>>  ورود به انجمن تخصصی


نطر خودتان درباره این صفحه را با ما در میان گذاشته و در صورت تمایل از Developer1 حمایت نمایید :

آیا مطالب این صفحه برای شما مناسب و مفید بوده است :

نام :                 
آدرس Email :    
 
نظر شما :  
 
سوال امنیتی : پایتخت ایران ؟      
حمایت از سایت Developer1