مدیریت انواع state در ASP.NET - مفهوم View State و Control State
Managing State در ASP.NET
پروتکل HTTP یک پروتکل بدون وضعیت (stateless) است. هنگامی که اتصال کلاینت با سرور قطع می شود ، موتور ASP.NET اشیاء صفحه را حذف می نماید. در این صورت ، هر برنامه کاربردی تحت وب می تواند به صورت هم زمان ، برای ارائه خدمات به درخواست های متعددی ، بدون این که به حافظه سرور نیاز داشته باشد ، به کار برده شود.
با این حال ، نیاز است که از برخی از تکنیک ها برای ذخیره کردن اطلاعات بین درخواست ها و بازیابی آنها در صورت لزوم استفاده شود. این اطلاعات ، یعنی مقادیر کل کنترل ها و متغیرها برای کاربر جاری در جلسه (session) جاری ، State نامیده می شود.
ASP.NET چهار نوع از state ها را مدیریت می کند:
- View State
- Control State
- Session State
- Application State
View State
view state وضعیت صفحه و تمام کنترل های آن می باشد. این وضعیت به طور خودکار در میان پست ها ، از طریق فریم ورک ASP.NET نگهداری می شود.
هنگامی که یک صفحه به کلاینت ارسال می شود ، تغییرات در خصیصه های page و کنترل های آن تعیین شده و در فیلد ورودی مخفی به نام _VIEWSTATE ذخیره می شوند. زمانی که صفحه مجدداً به سرور ارسال می شود ، فیلد _VIEWSTATE با درخواست HTTP به سرور ارسال می شود.
View state می تواند برای موارد ذیل فعال یا غیرفعال باشد:
- برای کل برنامه کاربردی ، از طریق تنظیم نمودن خصیصه EnableViewState در بخش <pages> از فایل web.config .
- برای یک صفحه ، از طریق تنظیم نمودن صفت EnableViewState از دایرکتیو Page ، به صورت <%@ Page Language="C#" EnableViewState="false" %> .
- برای یک کنترل ، از طریق تنظیم نمودن خصیصه Control.EnableViewState .
view state با استفاده از یک شیء view state که با کلاس StateBag تعریف می شود ، پیاده سازی می گردد ، که یک مجموعه از آیتم های view state را تعریف می کند. State bag یک ساختار داده ای است که حاوی جفت صفت-مقادیر می باشد ، و به عنوان رشته مرتبط با اشیاء ذخیره می شود.
کلاس StateBag دارای خصیصه های زیر می باشد:
خصیصه |
توضیحات |
Item(name) |
مقداری از آیتم view state با نام مشخص شده می باشد. این خصیصه ، یک خصیصه پیش فرض از کلاس StateBag می باشد. |
Count |
تعداد آیتم ها در مجموعه view state می باشد. |
Keys |
مجموعه از کلیدها برای آیتم ها در مجموعه view state می باشد. |
Values |
مجموعه ای از مقادیر برای تمام آیتم ها در مجموعه view state می باشد. |
کلاس StateBag متدهای زیر را دارا می باشد:
متد |
توضیحات |
Add(name, value) |
یک آیتم را به مجموعه view state اضافه کرده و آیتم موجود را به روز می کند. |
Clear |
تمام آیتم های را مجموعه حذف می نماید. |
Equals(Object) |
تعیین می کند که آیا شیء مشخص شده برابر با شیء جاری است یا خیر. |
Finalize |
اجازه می دهد که منابع آزاد شده و عملیات پاکسازی دیگری انجام شود. |
GetEnumerator |
یک شمارنده را باز می گرداند که تمام جفت های key/value از اشیاء StateItem ذخیره شده در شیء StateBag را تکرار می کند. |
GetType |
نوع نمونه جاری را می گیرد. |
IsItemDirty |
یک شیء StateItem ذخیره شده در شیء StateBag را برای ارزیابی این که آیا تغییر کرده است یا خیر، مورد بررسی قرار می دهد. |
Remove(name) |
تمام آیتم های مشخص شده را حذف می نماید. |
SetDirty |
وضعیت شیء StateBage و هم چنین خصیصه Dirty از هر شیء StateItem متصل شده به آن را تنظیم می کند. |
SetItemDirty |
خصیصه Dirty را برای شیء StateItem مشخص شده در شیء StateBag را تنظیم می کند. |
ToString |
یک رشته را باز می گرداند که نشان دهنده شی StateBag است. |
مثال
مثال زیر مفهوم ذخیره سازی view state را نشان می دهد. در اینجا ، یک شمارنده ای در نظر گرفته شده است ، و هر بار که صفحه با کلیک کردن بر روی کلید موجود در صفحه ، به سرور پست می شود ، یک واحد افزایش می یابد. یک کنترل برچسب مقدار شمارنده را نشان می دهد.
کد فایل markup به صورت زیر می باشد:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>View State demo</h3>
Page Counter:
<asp:Label ID="lblCounter" runat="server" />
<asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" />
</div>
</form>
</body>
</html>
کد پشت فایل برای این مثال در ادامه آورده شده است:
public partial class _Default : System.Web.UI.Page
{
public int counter
{
get
{
if (ViewState["pcounter"] != null)
{
return ((int)ViewState["pcounter"]);
}
else
{
return 0;
}
}
set
{
ViewState["pcounter"] = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
lblCounter.Text = counter.ToString();
counter++;
}
}
با اجرای کدهای فوق ، نتیجه زیر تولید خواهد شد:
Control State
Control State را نمی توان تغییر داد.
Session State
هنگامی که یک کاربر به یک وب سایت ASP.NET متصل می شود ، یک شیء جلسه (session) جدید ایجاد می شود. زمانی که وضعیت جلسه به حالت روشن است ، یک شیء session state برای هر درخواست جدید ایجاد می شود. این شیء session state ، بخشی از context شده و از طریق صفحه قابل دسترسی است.
Session State به طور کلی برای ذخیره کردن داده های برنامه کاربردی مانند موجودی ، لیست تأمین کنندگان ، رکوردهای مشتری یا سبد خرید مورد استفاده قرار می گیرد. هم چنین ، می تواند اطلاعاتی را در مورد مشتری و تنظیمات او نگهداری کند ، و پیگری اطلاعات عملیات های در انتظار (pending) را نیز حفظ نماید.
جلسات ، با SessionID 120 بیتی شناسایی و ردیابی می شوند ، که از طریق کلاینت به سرور منتقل می شوند و یا به عنوان کوکی یا یک URL اصلاح شده برگردانده می شوند. SessionID به صورت جهانی یکتا و تصادفی می باشد.
شیء session state از کلاس HttpSessionState ایجاد شده است ، و مجموعه ای از آیتم های session state را تعریف می کند.
کلاس HttpSessionState دارای خصیصه های زیر می باشد:
خصیصه |
توضیحات |
SessionID |
شناسه منحصربفرد جلسه می باشد. |
Item(name) |
مقدار آیتم session state با نام مشخص شده می باشد. این خصیصه ، یک خصیصه پیش فرض از کلاس HttpSessionState می باشد. |
Count |
تعداد آیتم ها در مجموعه session state می باشد. |
TimeOut |
قبل از این که session-state provider به جلسه خاتمه دهد ، مقدار زمان مجاز بین درخواست ها را به دقیقه گرفته و تنظیم می کند. |
متدهای کلاس session state به شرح ذیل می باشند:
متد |
توضیحات |
Add(name, value) |
یک ایتم را به مجموعه session state اضافه می کند. |
Clear |
تمام آیتم ها را از مجموعه session state حذف می نماید. |
Remove(name) |
آیتم های مشخص شده را از مجموعه session state حذف می نماید. |
RemoveAll |
تمام کلیدها و مقادیر را از مجموعه session state حذف می نماید. |
RemoveAt |
|
شیء session state یک جفت name-value برای ذخیره و بازیابی برخی از اطلاعات از شیء session state می باشد. ما می توانیم از کد زیر برای این منظور استفاده نماییم.
void StoreSessionInfo()
{
String fromuser = TextBox1.Text;
Session["fromuser"] = fromuser;
}
void RetrieveSessionInfo()
{
String fromuser = Session["fromuser"];
Label1.Text = fromuser;
}
کد فوق فقط رشته هایی را در شیء session dictionary ذخیره می کند ، با این حال ، می تواند تمام انواع داده های اولیه و آرایه های متشکل از انواع داده های اولیه ، و هم چنین داده های DataSet ، DataTable ، HashTable و اشیاء Image ، و هم چنین هر کلاس تعریف شده توسط کاربر را که از شیء ISerializable به ارث می برد را ذخیره نماید.
مثال
مثال زیر مفهوم ذخیره سازی session state را نشان می دهد. دو کلید ، یک کادر متن برای وارد کردن رشته و یک برچسب برای نمایش دادن متن ذخیره شده از جلسه قبل ، در صفحه وجود دارند.
کد فایل markup به صورت زیر می باشد:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 568px; height: 103px">
<tr>
<td style="width: 209px">
<asp:Label ID="lblstr" runat="server" Text="Enter a String" style="width:94px">
</asp:Label>
</td>
<td style="width: 317px">
<asp:TextBox ID="txtstr" runat="server" style="width:227px">
</asp:TextBox>
</td>
</tr>
<tr>
<td style="width: 209px"> </td>
<td style="width: 317px"> </td>
</tr>
<tr>
<td style="width: 209px">
<asp:Button ID="btnnrm" runat="server"
Text="No action button" style="width:128px" />
</td>
<td style="width: 317px">
<asp:Button ID="btnstr" runat="server"
OnClick="btnstr_Click" Text="Submit the String" />
</td>
</tr>
<tr>
<td style="width: 209px"> </td>
<td style="width: 317px"> </td>
</tr>
<tr>
<td style="width: 209px">
<asp:Label ID="lblsession" runat="server" style="width:231px" >
</asp:Label>
</td>
<td style="width: 317px"> </td>
</tr>
<tr>
<td style="width: 209px">
<asp:Label ID="lblshstr" runat="server">
</asp:Label>
</td>
<td style="width: 317px"> </td>
</tr>
</table>
</div>
</form>
</body>
</html>
طراحی صفحه ایجاد شده باید به صورت تصویر زیر باشد:
کد پشت فایل به صورت زیر است:
public partial class _Default : System.Web.UI.Page
{
String mystr;
protected void Page_Load(object sender, EventArgs e)
{
this.lblshstr.Text = this.mystr;
this.lblsession.Text = (String)this.Session["str"];
}
protected void btnstr_Click(object sender, EventArgs e)
{
this.mystr = this.txtstr.Text;
this.Session["str"] = this.txtstr.Text;
this.lblshstr.Text = this.mystr;
this.lblsession.Text = (String)this.Session["str"];
}
}
فایل را اجرا کرده و نحوه عملکرد آن را مشاهده می نماییم:
Application State
برنامه کاربردی ASP.NET مجموعه ای از تمام صفحات وب ، کدها و سایر فایل های داخل یک دایرکتوری مجازی یا یک سرور وب می باشد. هنگامی که اطلاعات در application state ذخیره می شوند ، این اطلاعات برای تمام کاربران در دسترس می باشند.
برای استفاده از application state ، فریم ورک ASP.NET یک شیء application state برای هر برنامه کاربردی از کلاس HTTPApplicationState ایجاد کرده و این شیء را در حافظه سرور ذخیره می کند. این شیء توسط فایل کلاس global.asax نشان داده می شود.
Application State ، غالباً برای ذخیره کردن شمارنده hit و سایر داده های استاتیک ، داده های سراسری از برنامه کاربردی مانند tax rate ، discount rate و غیره ، و برای نگهداری اطلاعات ردیابی کاربر بازدید کننده از سایت مورد استفاده قرار می گیرد.
کلاس HTTPApplicationState خصیصه های زیر را دارا می باشد:
خصیصه |
توضیحات |
Item(name) |
مقدار آیتم Application State با نام مشخص شده می باشد. این خصیصه ، یک خصیصه پیش فرض از کلاس HTTPApplicationState می باشد. |
Count |
تعداد آیتم های موجود در مجموعه application state می باشد. |
کلاس HTTPApplicationState متدهای زیر را دارا می باشد:
متد |
توضیحات |
Add(name, value) |
یک آیتم را به مجموعه application state اضافه می کند. |
Clear |
تمام آیتم ها را از مجموعه application state حذف می کند. |
Remove(name) |
آیتم های مشخص شده را از مجموعه application state حذف می کند. |
RemoveAll |
تمام اشیاء را از مجموعه HttpApplicationState حذف می کند. |
RemoveAt |
یک شیء HttpApplicationState را از طریق ایندکس حذف می نماید. |
Lock() |
مجموعه application state را قفل می کند ، به طوری که فقط کاربر جاری می تواند به آن دسترسی داشته باشد. |
Unlock() |
قفل مجموعه application state را باز می کند ، به طوری که تمام کاربران می توانند به آن دسترسی داشته باشند. |
داده های application state به طور کلی با نوشتن هندلرها برای رویدادها نگهداری می شوند. این هندلرها عبارتند از:
- Application_Start
- Application_End
- Application_Error
- Session_Start
- Session_End
قطعه کد زیر ، قاعده نوشتاری (syntax) ذخیره کردن اطلاعات application state را نشان می دهد:
Void Application_Start(object sender, EventArgs e)
{
Application["startMessage"] = "The application has started.";
}
Void Application_End(object sender, EventArgs e)
{
Application["endtMessage"] = "The application has ended.";
}
این فصل در یک نگاه:
در این فصل پس از بررسی سیستم مسیریابی و طراحی صفحه نمایش ویدیو ها، به سراغ پنل کاربری خواهیم رفت و مباحث Model Binding و…
توجه: این دوره آموزشی به صورت پیوسته بر اساس آخرین نسخه ی ASP.NET Core بروزرسانی خواهد شد. آموزش صفر تا صد طراحی سایت اشتراک ویدیو مشابه آپارات با استفاده از ASP.NET CORE MVC 3.0 و V…این فصل در یک نگاه:
…
توضیحات کلی مجموعه: در این مجموعه قصد داریم تا فروشگاه اینترنتی دیجی کالا رو با Asp.Net Core3 پیاده سازی کنیم. ابتدا طراحی قالب دیجی کالا رو به صورت کامل انجام خواهیم داد. در مرحله میریم …این فصل در یک نگاه:
…
توضیحات کلی مجموعه: در این مجموعه آموزشی، با استفاده از جدیدترین تکنولوژی ها و ابزار های مایکروسافت (دات نت)، به یک پروژه جذاب مدیریت آگهی مشابه دیوار می پردازیم. این آموزش در دو بخش کلی و…این فصل در یک نگاه:
در این دوره به آموزش صفر تا صد جدیدترین نسخه ASP یعنی CORE جدیدترین ورژن خواهیم پرداخت.این آموزش از سطح مقدماتی تا فوق …
دوره آموزش کامل طراحی وب به همراه پروژه ساخت سیستم مدیریت کتابخانه این دوره با کور 1 آغاز می شود و در ادامه پروژه به کور 2 تبدیل می شودو پروژه نهایی (سیستم مدیریت کتابخانه) با Asp.net کور…این فصل در یک نگاه:
ساخت محیط کاربریآموزش نحوه ی ارسال ایمیل در Asp.net MVCآموزش تنظیمات Gmail برای استفادهاستفاده از Yahooاستفاده از سرویس …
به نام خدا... در خدمتتون هستم با آموزش ارسال ایمیل در Asp.net MVC... ارسال ایمیل یکی از اجزای اصلی ییک سایت به شمار می رود و واقعا سایتی که برای اجزای مختلفش همانند ثبت کاربر جدید و یا ارسال…این فصل در یک نگاه:
فصل دوم در یک نگاه:فصل دوم در یک نگاه:…
در این پکیج به مبحث طراحی وب ، در قالب ساخت یک سایت فروشگاهی 5040 به آدرس http://5040.ir می پردازیم که به جرات مشهورترین و یکی از برترین فروشگاه های مجازی در کشور است. در این مجموعه قصد داری…این فصل در یک نگاه:
…
در این دوره آموزشی، وبسایت ورزش3 را با استفاده از ASP.NET Core پیاده سازی می کنیم و همچنین اپ اندروید آن را هم با Xamarin متصل به سرور سایت طراحی و در نهایت نحوه انتشار آن در مارکت هایی مثل …این فصل در یک نگاه:
کاملترین آموزش هاست و کار با سی پنل.در هنگام خرید سرویس هاست کلمه ای به نام “کنترل پنل” را زیاد خواهید دید آیا تا به حال…
سی پنل یک کنترل پنل هاست محبوب و معروف در جهان و ایران است. در فیلم آموزش سی پنل هم توصیه اکید شده تا افراد مبتدی و حتی افراد حرفه ای از این کنترل پنل هاست سی پنل استفاده کنند. آموزش cpanel …این فصل در یک نگاه:
فصل پنجم…
توضیحات کلی مجموعه: درباره گیت: لذت پیش بردن پروژه های برنامه نویسی خود را با بهترین ورژن کنترل سیستم جهان تجربه کنید کامل ترین دوره ی آموزشی گیت و گیت هاب به همراه مثال های کاربردی گی…این فصل در یک نگاه:
رشد و درآمدزایی یک وب سایت یا کسب و کار اینترنتی کاملا به ذوق و مهارت وب مستر یا همان مدیر اصلی وب سایت گره خورده و متاس…
اصول مدیریت وب سایت برای وب مستر شدن برای موفقیت یک وب سایت لازم الاجراست. زیرا شما دوست دارید وب سایت خود را به کارخانه پولسازی تبدیل کنید. این واقعیت رویا نیست. هرکس این اصول را بداند به …