مدیریت Session در MVC 5
چهارشنبه 5 اسفند 1394در این مقاله درباره State management و مدیریت Sessionها صحبت خواهد شد. State management مفهوم بسیار مهم و کارامدی در Wb Application است. اهمیت آن مانند منابع یا resourceها است که بدون ارزش نمی توانند اختصاص داده شوند.
در این مقاله درباره State management و مدیریت Sessionها صحبت خواهد شد. State management مفهوم بسیار مهم و کارامدی در Web Application است. اهمیت آن مانند منابع یا resourceها است که بدون ارزش نمی توانند اختصاص داده شوند.
در MVC می توانیم sessionها را در کنترلر مدیریت کنیم که به غیرفعال کردن session زمانی که به اطلاعات آن برای کنترلر خاصی نیاز نیست کمک میکند و با توجه به آن می توانیم عملکرد یک برنامه را با آزاد کردن منابعی که نیاز نیست اختصاص داده شوند بالا ببریم. این کار به کمک صفت SessionState امکان پذیر است.
SessionState صفتی از کلاس کنترلر است که برای کنترل یا مدیریت رفتار default session استفاده می شود. برای استفاده از آن باید از فضای نام System.Web.SessionState بکار برده شود. در زیر رفتارهای صفت SessionState آمده است :
1. Default
2. Disabled
3. Required
4. ReadOnly
Default : رفتار پیش فرض SessionState برای Session هنگامی که در خواست کاربر به کنترلر می آید با کمک اینترفیس IHttpHandler چک می شود.
به طور مثال :
[SessionState(SessionStateBehavior.Default)] public class HomeController : Controller { // Action methods }
Disabled : زمانی که رفتار SessionState به این صورت تنظیم شود، درخواست های کاربر را که به کنترلر می آیند چک نخواهد کرد و Session را برای کنترلر و Viewهایش غیر فعال میکند.
مثال :
[SessionState( SessionStateBehavior.Disabled)] //controller public class HomeController : Controller { // Action methods }
Required : زمانی که رفتار SessionState به این صورت تنظیم شود، هر درخواست به کنترلر چک می شودو Session را برای کنترلر خاصی فعال میکند. این رفتار زمانی استفاده می شود که Session را برای هر درخواست کاربر بخواهیم.
[ SessionState( SessionStateBehavior.Required)] //controller public class HomeController : Controller { // Action methods }
ReadOnly : هنگامی که رفتار به این صورت تنظیم می شود ، sessionstate نمی تواند اصلاح یا آپدیت شود. این رفتار برای اطمینان از اینکه Sessionstate تغییر نخواهد کرد مفید است.
[ SessionState( SessionStateBehavior.ReadOnly)] //controller public class HomeController : Controller { // Action methods }
برای پیاده سازی آن به صورت زیر عمل میکنیم.
مرحله اول ایجاد یک برنامه MVC است. برنامه را به صورت MVC empty ایجاد میکنیم.
مرحله بعد اضافه کردن کلاس مدل است. بر روی پوشه Model کلیک راست کرده و کلاسی با نام EmpModel اضافه میکنیم و کدهای زیر را در آن قرار می دهیم.
public class EmpModel { public string Name { get; set; } }
کنترلرهای کاربر و ادمین را ایجاد میکنیم. با کلیک راست بر روی پوشه کنترلر آنها را به صورت زیر ایجاد میکنیم.
نام کنترلر را مشخص کرده و بر روی add کلیک میکنیم. HomeController را باز کرده و کدهای زیر را در آن قرار می دهیم.
using System; using System.Web.Mvc; using SessionStateAttributeInMVC.Models; using System.Web.SessionState; namespace SessionStateAttributeInMVC.Controllers { [ SessionState( SessionStateBehavior.Disabled)] public class HomeController : Controller { // GET: Home public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(EmpModel obj) { //store the session from user input and display into the view if session is enabled. Session["Name"] = Convert.ToString(obj.Name); return View(); } } }
در کنترلر بالا صفت SessionState را با رفتار Disabled ایجاد کردیم و در متد Post مقادیر ورودی کاربر را درون Session ذخیره کردیم و به view برای نمایش مقادیر Session برگرداندیم.
مرحله بعد اضافه کردن View به صورت Strongly typed است. در هنگام ایجاد View ، کلاس EmpModel را در آن قرار می دهیم .
کدهایی را برای مقادیر Read Session اگر فعال باشد مینویسیم. بعد از اصلاح کد ، کدها در View به صورت زیر خواهد بود.
@model SessionStateAttributeInMVC.Models.EmpModel @{ ViewBag.Title = "www.compilemode.com"; } @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>EmpModel</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) </div> </div> @if (Session["Name"] != null) { //if session is enabled then display the session value @Html.Label(Convert.ToString(Session["Name"]), htmlAttributes: new { @class = "control-label col-md-4" }) } <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> }
برنامه را اجرا کنید. با خطای زیر مواجه خواهید شد.
در بالا خطای null reference exeption رخ داده است، زیرا در کنترلر رفتار Seeeion را به صورت disabled تنظیم کردیم .
اکنون رفتار Session را به صورت default تنظیم میکنیم.
using System; using System.Web.Mvc; using SessionStateAttributeInMVC.Models; using System.Web.SessionState; namespace SessionStateAttributeInMVC.Controllers { [ SessionState( SessionStateBehavior.Default)] public class HomeController : Controller { // GET: Home public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(EmpModel obj) { //store the session from user input and display into the view if session is enabled. Session["Name"] = Convert.ToString(obj.Name); return View(); } } }
برنامه را اجرا کرده و مقداری در Textbox وارد میکنیم. این مقدار با استفاده از Session به صورت زیر نمایش داده می شود.
خروجی نمایش داده شد به این دلیل که Session در سطح کنترلر فعال شد.
- ASP.net MVC
- 5k بازدید
- 15 تشکر