متغيرات الجلسة في ASP.NET MVC




asp.net-mvc session (7)

أقوم بكتابة تطبيق ويب يسمح للمستخدم بالتصفح إلى صفحات ويب متعددة داخل الموقع الإلكتروني لتقديم طلبات معينة. سيتم تخزين جميع المعلومات التي يقوم المستخدم بإدخالها في كائن قمت بإنشائه. المشكلة هي أنني بحاجة إلى الوصول إلى هذا الكائن من أي جزء من الموقع ولا أعرف بالفعل أفضل طريقة لتحقيق ذلك. أعلم أن أحد الحلول هو استخدام متغيرات الجلسة ولكن لا أعرف كيفية استخدامها في asp .net MVC. وأين يمكنني أن أعلن متغير جلسة؟ هل هناك أي طريقة أخرى؟


أجوبة رائعة من الرجال لكني أحذرك من الاعتماد على الدورة دائماً. إنه سريع وسهل القيام بذلك ، وبالطبع سيعمل ، لكنه لن يكون عظيماً في جميع أنواع cicrumstances.

على سبيل المثال ، إذا قمت بتشغيل سيناريو حيث لا تسمح استضافة الخاص بك استخدام جلسة العمل أو إذا كنت في مزرعة ويب أو في مثال تطبيق SharePoint مشترك.

إذا أردت حلًا مختلفًا ، يمكنك النظر إلى استخدام حاوية IOC مثل Castle Windsor ، مما يؤدي إلى إنشاء فئة موفر كمغلف ، ثم الاحتفاظ بمثيل واحد من فصلك باستخدام كل طلب أو نمط حياة جلسة العمل وفقًا لمتطلباتك.

ستضمن اللجنة الأولمبية الدولية إعادة نفس المثيل في كل مرة.

أكثر تعقيدا نعم ، إذا كنت بحاجة إلى حل بسيط مجرد استخدام الدورة.

فيما يلي بعض الأمثلة على التنفيذ أدناه بدون اهتمام.

باستخدام هذه الطريقة ، يمكنك إنشاء فئة موفر على غرار:

public class CustomClassProvider : ICustomClassProvider
{
    public CustomClassProvider(CustomClass customClass)
    { 
        CustomClass = customClass;
    }

    public string CustomClass { get; private set; }
}

وتسجيله شيء من هذا القبيل:

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container.Register(
            Component.For<ICustomClassProvider>().UsingFactoryMethod(
                () => new CustomClassProvider(new CustomClass())).LifestylePerWebRequest());
    }

أعتقد أنك سترغب في التفكير في ما إذا كانت الأشياء تنتمي حقاً في حالة جلسة عمل. هذا شيء أجد نفسي أفعله بين الحين والآخر ، وهو منهج جيد مكتوب بشكل جيد لكل شيء ولكن يجب أن تكون حذراً عند وضع الأشياء في سياق الجلسة. ليس كل شيء يجب أن يكون هناك فقط لأنه ينتمي إلى بعض المستخدمين.

في global.asax ربط الحدث OnSessionStart

void OnSessionStart(...)
{
    HttpContext.Current.Session.Add("__MySessionObject", new MySessionObject());
}

من أي مكان في التعليمات البرمجية حيث الخاصية HttpContext.Current! = فارغة يمكنك إعادة الكائن. أفعل هذا مع طريقة التمديد.

public static MySessionObject GetMySessionObject(this HttpContext current)
{
    return current != null ? (MySessionObject)current.Session["__MySessionObject"] : null;
}

بهذه الطريقة يمكنك في التعليمات البرمجية

void OnLoad(...)
{
    var sessionObj = HttpContext.Current.GetMySessionObject();
    // do something with 'sessionObj'
}

الإجابة هنا صحيحة ، لكنني كافحت لتطبيقها في تطبيق ASP.NET MVC 3. أردت الوصول إلى كائن جلسة عمل في وحدة تحكم ولم أستطع معرفة السبب الذي جعلني أحافظ على "عدم تعيين المثيل لمثيل خطأ كائن". ما لاحظت أنه في وحدة تحكم عندما حاولت الوصول إلى الجلسة عن طريق القيام بما يلي ، ظللت على هذا الخطأ. هذا بسبب حقيقة أن هذا. HttpContext جزءًا من كائن وحدة التحكم.

this.Session["blah"]
// or
this.HttpContext.Session["blah"]

ومع ذلك ، ما أردت هو HttpContext هذا جزء من مساحة الاسم System.Web لأن هذا هو واحد يقترح الإجابة أعلاه للاستخدام في Global.asax.cs. لذلك كان علي أن أفعل ما يلي بوضوح:

System.Web.HttpContext.Current.Session["blah"]

هذا ساعدني ، لست متأكدا مما إذا كنت قد فعلت أي شيء غير MO هنا ، ولكن آمل أن يساعد شخص ما!


حسنا ، IMHO ..

  1. لا تشير أبدًا إلى جلسة داخل العرض / الصفحة الرئيسية
  2. تقليل استخدامك للدورة. يوفر MVC TempData obj لهذا ، وهو في الأساس جلسة تعيش لرحلة واحدة إلى الخادم.

فيما يتعلق بالرقم # 1 ، لديّ طريقة عرض رئيسية تم كتابتها بقوة والتي تحتوي على خاصية للوصول إلى ما يمثله كائن الجلسة .... في حاسوبي ، طريقة العرض الرئيسية التي تم كتابتها بشكل دقيق هي طريقة عرض عامة تمنحني بعض المرونة فيما يتعلق بصفحات العرض التي تم كتابتها بقوة

ViewMasterPage<AdminViewModel>

AdminViewModel
{
    SomeImportantObjectThatWasInSession ImportantObject
}

AdminViewModel<TModel> : AdminViewModel where TModel : class
{
   TModel Content
}

وثم...

ViewPage<AdminViewModel<U>>

على الرغم من أنني لا أعرف عن asp.net mvc ، ولكن هذا ما ينبغي لنا القيام به في موقع الويب العادي. يجب أن تعمل من أجل asp.net mvc أيضا.

YourSessionClass obj=Session["key"] as YourSessionClass;
if(obj==null){
obj=new YourSessionClass();
Session["key"]=obj;
}

يمكنك وضع هذا داخل طريقة لسهولة الوصول. HTH


نظرًا لأنني لا أحب مشاهدة "HTTPContext.Current.Session" حول المكان ، أستخدم نمطًا مفردًا للوصول إلى متغيرات الجلسة ، حيث يمنحك الوصول السهل إلى حقيبة البيانات المكتوبة بشدة.

[Serializable]
public sealed class SessionSingleton
{
    #region Singleton

    private const string SESSION_SINGLETON_NAME = "Singleton_502E69E5-668B-E011-951F-00155DF26207";

    private SessionSingleton()
    {

    }

    public static SessionSingleton Current
    {
        get
        {
            if ( HttpContext.Current.Session[SESSION_SINGLETON_NAME] == null )
            {
                HttpContext.Current.Session[SESSION_SINGLETON_NAME] = new SessionSingleton();
            }

            return HttpContext.Current.Session[SESSION_SINGLETON_NAME] as SessionSingleton;
        }
    }

    #endregion

    public string SessionVariable { get; set; }
    public string SessionVariable2 { get; set; }

    // ...

يمكنك الوصول إلى بياناتك من أي مكان:

SessionSingleton.Current.SessionVariable = "Hello, World!";

يمكنك استخدام ViewModelBase كفئة أساسية لجميع الموديلات ، وسوف يهتم هذا الصف بسحب البيانات من الجلسة

class ViewModelBase 
{
  public User CurrentUser 
  {
     get { return System.Web.HttpContext.Current.Session["user"] as User };
     set 
     {
        System.Web.HttpContext.Current.Session["user"]=value; 
     }
  }
}

يمكنك كتابة أسلوب extention على HttpContextBase للتعامل مع بيانات جلسة العمل

T FromSession<T>(this HttpContextBase context ,string key,Action<T> getFromSource=null) 
{
    if(context.Session[key]!=null) 
    {
        return (T) context.Session[key];
    }
  else if(getFromSource!=null) 
  {
    var value = getFromSource();
   context.Session[key]=value; 
   return value; 
   }
  else 
  return null;
}

استخدم هذا مثل أدناه في وحدة تحكم

User userData = HttpContext.FromSession<User>("userdata",()=> { return user object from service/db  }); 

الوسيطة الثانية اختيارية سيتم استخدامها لملء بيانات الجلسة لهذا المفتاح عندما تكون القيمة غير موجودة في الجلسة.







session-variables