آموزش 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
حمایت نمایید :