
یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شیگرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفهای و امکانات کامل!
مشاهده بیشتر
یادگیری MVC Core از مبانی تا پیشرفته: شیگرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژههای کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!
مشاهده بیشترمشخصات مقاله
آموزش مدیریت وضعیت در ASP.NET
مدیریت state- ASP.NET
Hyper Text Transfer Protocol(منشور انتقال ابرمتن) یک پرورتکل ناپایدار (stateless) می باشد. هنگامی که سرویس گیرنده (client) ارتباط خود را با سرویس دهنده (server) قطع می کند، موتور ASP.NET اشیاء page را دور می اندازد. از این طریق، هر برنامه ی تحت وبی قادر خواهد بود تا حدی گسترده شود که امکان سرویس دادن به چندین درخواست (request) به طور همزمان و بدون کم آوردن حافظه سرور فراهم آید.
با این حال باید مکانیزم یا تکنیکی وجود داشته باشد که از طریق آن اطلاعات بین درخواست ها (request) ذخیره گردیده و امکان بازیابی آن ها در صورت لزوم بوجود آید. این اطلاعات (مقادیر جاری کلیه ی کنترل ها و متغیرها ویژه ی کاربر جاری در session فعلی) state (وضعیت) خوانده می شود.
ASP.NET چهار نوع مختلف state مدیریت می کند که به شرح زیر می باشند:
- View State
- Control State
- Session State
- Application State
View State
View state در اصل همان وضعیت صفحه و تمامی کنترل های آن می باشد. View state به صورت پیش فرض در تمامی post ها (صفحات ASP.NET) فعال می باشد.
ViewState وضعیت و اطلاعات تمامی اجزا و المان های فرم را در قالب فیلدهای پنهانی که داخل یک فرم با خاصیت " runat = " server قرار دارد، نگهداری می کند.
به عبارتی دیگر، هنگامی که صفحه به سرویس گیرنده برگردانده می شود، تغییرات وارد آمده در خصوصیات (property) صفحه و کلیه ی کنترل های آن مشخص شده، سپس در فیلد پنهانی به نام _VIEWSTATE ذخیره می گردد. هنگامی که صفحه دوباره post back می شود، فیلد _VIEWSTATE به همراه HTTP request به سرویس دهنده ارسال می گردد.
View state را می توان برای موارد زیر فعال یا غیر فعال ساخت:
برای کل برنامه، این کار را می توان با متصل کردن خاصیت EnableViewState به بخش
برای یک صفحه، از طریق مقداردهی خصیصه ی EnableViewState Page directive)) به صورت زیر:
1 2 | < %@Page Language= "C#" EnableViewState= "false" % > <button></button> |
برای یک کنترل. کافی است خاصیت EnableViewState را متصل کنید.
state bag یک ساختار داده ای دربردارنده ی جفت های خصیصه و مقدار (attribute value pairs) می باشد که به صورت رشته های متصل و مرتبط با اشیاء ذخیره می گردند.
کلاس statebag دارای خواص زیر می باشد:
متدهای این کلاس نیز به ترتیب زیر می باشند:
مثال:
مثال زیر مفهوم ذخیره سازی view state را نمایش می دهد. یک شمارش گر (counter) در نظر می گیریم که با هر بار postback (و کلیک یک دکمه روی صفحه) یک واحد افزایش می یابد. یک کنترل label مقدار مربوطه را در شمارش گر نمایش می دهد.
Markup file code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | < %@ 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" > < 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 > <button></button> |
Code-behind < /html >
(کد منبع) مثال فوق را ذیل مشاهده می کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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; } } } <button></button> |
نتیجه ی زیر بدست می آید:

Control State
نمی توان به صورت مستقیم به Control stateدسترسی پیدا کرده، آن را اصلاح و یا غیر فعال ساخت.
Session State
هنگامی که کاربر به یک وب سایت ASP.NET وصل می شود، در همان زمان یک شئ جدید session ایجاد می گردد. همچنین هنگامی که session state فعال سازی می شود، یک شئ session state ویژه ی هر درخواست (request) ساخته می شود. شئ session state ایجاد شده در واقع به بخشی از context یا متن تبدیل شده و از طریق صفحه قابل دسترسی می باشد.
Session state عموما به منظور ذخیره سازی اطلاعات و داده های اپلیکیشن همچون inventory (لیست موجودی)، تهیه کننده، سبد خرید و رکورد مشتری بکار می رود. همچنین می تواند اطلاعاتی درباره ی کاربر، تمایلات وی و عملیات معلق (pending operation) در خود نگه دارد.
Session ها به وسیله ی یک sessionID (شناسه ی session) شناسایی و ردگیری (trace) می شوند که از کلاینت به سرور ارسال شده و سپس به صورت کوکی یا یک URL اصلاح شده برگردانده می شوند. لازم به ذکر است که sessionID منحصر بفرد بوده و علاوه بر آن کاملاً تصادفی می باشد.
شئ session state از کلاس HttpSessionState مشتق و ساخته شده است که مجموعه ای (collection) از آیتم های session state را تعریف می کند.
کلاس HttpSessionState دارای خواص زیر می باشد:
توابع کلاس فوق با ذکر شرح آن ها در جدول زیر برای شما لیست شده اند:
شئ session state یک جفت اسم-مقدار (name-value pair) می باشد که با استفاده از آن می توان اطلاعاتی را ذخیره کرده و از شئ state object بازیابی کرد. از کد زیر می توانید برای همین منظور بهره بگیرید:
1 2 3 4 5 6 7 8 9 10 11 12 | void StoreSessionInfo() { String fromuser = TextBox1.Text; Session[ "fromuser" ] = fromuser; } void RetrieveSessionInfo() { String fromuser = Session[ "fromuser" ].ToString(); Label1.Text = fromuser; } <button></button> |
همان طور که مشاهده می کنید کد فوق تنها رشته ها را در Session dictionary objectذخیره می کند. با این حال قادر است کلیه ی نوع داده های اولیه (primitive data type) و آرایه های متشکل از نوع داده های اولیه و همچنین DataSet، DataTable، HashTableو اشیاء image و هر کلاس دیگری که توسط کاربر تعریف شده و از شئ ISerializable به ارث می برد را در خود ذخیره و نگه داری کند.
مثال:
مثال ذیل مفهوم ذخیره سازی session state را شرح می دهد. در این مثال از دو دکمه روی صفحه به اضافه ی یک text box به منظور وارد کردن رشته و همچنین یک label ویژه ی نمایش دادن نوشته که از session قبل ذخیره شده و باقی مانده استفاده می شود.
Markup file code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | < %@ 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" > < 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 > <button></button> |
کد فوق هنگامی که پیاده سازی می شود در design view ظاهری مشابه تصویر زیر خواهد داشت:

Code behind file:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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" ]; } } <button></button> |
حال فایل را اجرا کرده و نتیجه ی آن را مشاهده کنید:

Application state
تکنولوژی Asp.Net این اجازه را به شما می دهد تا مقادیر را به وسیله قابلیت Application State که مشتق شده از کلاس HTTP Application State است ، برای هر برنامه ی تحت وب فعال ، نگهداری کنید. Application State، یک حافظه سراسری یا عمومی ( Global ) بوده که از طریق تمامی صفحات برنامه وب قابل دسترسی است. بنابراین حافظه برای نگهداری اطلاعات عمومی و اطلاعاتی که باید در هر بار ارسال صفحات به سرور مورد استفاده قرار بگیرد، مناسب است. Application State در زوج های نام / مقدار، برای هر درخواست به یک آدرس مشخص URL ایجاد می شوند.
اپلیکیشن ASP.NET در واقع مجموعه ای از تمامی صفحات وب، کدها و دیگر فایل های داخل تک پوشه ی مجازی قرار گرفته بر روی server است. پس از اینکه که اطلاعات در application state ذخیره می شوند، این اطلاعات در اختیار همه ی کاربرها قرار می گیرند.
برای اینکه اطلاعات مذکور برای استفاده ی application state آماده شوند، ASP.NET یک شئ application state ویژه ی هر یک از اپلیکیشن ها، از کلاس HTTPApplicationState ایجاد کرد سپس شئ ایجاد شده را داخل حافظه ی سرور ذخیره می کند. این شئ توسط class file global.asax نمایش داده می شود.
Application state عمدتا جهت ذخیره سازی داده های آماری، داده های دریافتی از اپلیکیشن های عمومی مانند نرخ مالیات، نرخ نزول و حساب تعداد کاربرهایی که از سایت بازدید می کنند و غیره بکار می رود.
کلاس HttpApplicationState دارای خواص زیر می باشد:
توابع کلاس HttpApplicationState به شرح زیر می باشد:
- Application_Start
- Application_End
- Application_Error
- Session_Start
- Session_End
تکه کد زیر دستور نگارش (syntax) لازم برای ذخیره سازی اطلاعات application state را نمایش می دهد:
1 2 3 4 5 6 7 8 9 10 11 | 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." ; } <button></button> |