مدیریت Session در MVC 5

چهارشنبه 5 اسفند 1394

در این مقاله درباره State management و مدیریت Sessionها صحبت خواهد شد. State management مفهوم بسیار مهم و کارامدی در Wb Application است. اهمیت آن مانند منابع یا resourceها است که بدون ارزش نمی توانند اختصاص داده شوند.

مدیریت Session در MVC 5

 در این مقاله درباره  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  در سطح کنترلر فعال شد.

 

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید