এএসপি.নেট এমভিসি-তে সেশন ভেরিয়েবলগুলি


169

আমি একটি ওয়েব অ্যাপ্লিকেশন লিখছি যা কোনও ব্যবহারকারীকে নির্দিষ্ট অনুরোধ করে ওয়েবসাইটের মধ্যে একাধিক ওয়েব পৃষ্ঠাগুলিতে ব্রাউজ করার অনুমতি দেবে। সমস্ত তথ্য যা ব্যবহারকারীর ইনপুটগুলি আমি তৈরি করা একটি বস্তুর মধ্যে সংরক্ষণ করা হবে। সমস্যাটি হ'ল ওয়েবসাইটটির যে কোনও অংশ থেকে আমার এই অবজেক্টটি অ্যাক্সেস করা দরকার এবং আমি এটি সম্পাদন করার সর্বোত্তম উপায়টি জানি না। আমি জানি যে একটি সমাধান হ'ল সেশন ভেরিয়েবলগুলি ব্যবহার করা তবে আমি কীভাবে এএস। নেট এমভিসি তে সেগুলি ব্যবহার করব তা জানি না। এবং আমি কোথায় সেশন ভেরিয়েবল ঘোষণা করব? অন্য কোন উপায আছে কি?


3
আপনি ওয়েব সাইট এবং ওয়েব অ্যাপ্লিকেশন ধারণার মিশ্রণ করছেন ... তারা একই জিনিস নয়।
এড্রিপ্যানিকো

1
একটি ডেটাবেসের প্রয়োজনের মতো শোনাচ্ছে
কোপস

উত্তর:


123

আমি মনে করি আপনি কী ভাবতে চাইবেন যদি বিষয়গুলি সত্যই কোনও সেশন স্থিতির হয়। এটি এমন কিছু যা আমি নিজেকে এখন এবং পরে প্রতিটি কাজ করতে দেখি এবং পুরো বিষয়টি সম্পর্কে এটি দৃ a়ভাবে টাইপ করা পদ্ধতি তবে সেশন প্রসঙ্গে জিনিস রাখার সময় আপনার যত্নবান হওয়া উচিত। সমস্ত কিছু সেখানে থাকা উচিত নয় কারণ এটি কোনও ব্যবহারকারীর অন্তর্ভুক্ত।

গ্লোবাল.এক্সে অনসেশনস্টার্ট ইভেন্টটি হুক করেছে

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

কোডের যে কোনও জায়গা থেকে যেখানে এইচটিটিপি কনটেক্সট urrent বর্তমান সম্পত্তি! = নাল আপনি সেই বস্তুকে পুনরুদ্ধার করতে পারেন। আমি এটি একটি এক্সটেনশন পদ্ধতি দিয়ে করি।

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'
}

32
যদি এএসপি এমভিসি ব্যবহার করা হয় তবে এটি এইচটিটিপি কনটেক্সট.কন্টেনার.সেশন থেকে প্রকৃত সেশন অবজেক্টটি ব্যবহার না করা ভাল তবে সিস্টেমটি থেকে ওয়েবে.আবরস্ট্রাকশনস.ডিএল থেকে নতুন এইচটিটিপিএসশনস্টেটওয়্যার্পার এবং এইচটিটিপিসেশনস্টেটবেস ব্যবহার করা সেক্ষেত্রে ফ্যাক্টরি বা ডিআই ব্যবহার করুন সেশনটি পাওয়ার জন্য।
পল

6
সেশন ভেরিয়েবলকে আপনি কীভাবে কিছু বরাদ্দ করেন? (কেবল অ্যাক্সেসের বিপরীতে)
রাক্লোস

31
মানুষ জিনিসটা কি "OnSessionStart" ঘটনা চেষ্টা করার জন্য এবং কিভাবে আপনি "হুক" এটা দেখতে stackoverflow.com/questions/1531125/...
Cephron

5
@ পল আপনি কি একটি উদাহরণ দিতে সক্ষম? আমি এইচটিটিপিএসশনস্টেট স্ট্র্যাপ ব্যবহার করার কোনও উদাহরণ খুঁজে পাচ্ছি না।
জোসেফ উডওয়ার্ড

4
@AjayKelkar এই মন্তব্যটি থ্রেড প্রস্তাব "এএসপি MVC ব্যবহৃত হচ্ছে তাহলে এটি বাঞ্ছনীয় HttpContext.Current.Session থেকে প্রকৃত সেশন অবজেক্ট ব্যবহার না করার কিন্তু নতুন HttpSessionStateWrapper & HttpSessionStateBase ব্যবহার করতে" যা আপনার উত্তর দাড়ায় তা না ভাল
Coops

48

এখানে উত্তরটি সঠিক, আমি যদিও এটিএসপি.এনইটি এমভিসি 3 অ্যাপে প্রয়োগ করতে লড়াই করেছি। আমি একটি নিয়ামকের মধ্যে একটি সেশন অবজেক্ট অ্যাক্সেস করতে চেয়েছিলাম এবং আমি কেন "অবজেক্ট ত্রুটির উদাহরণ হিসাবে সেট না করা" পেয়েছি তা বুঝতে পারি না। আমি যেটা লক্ষ্য করেছি তা হ'ল একটি নিয়ামক হিসাবে যখন আমি নিম্নলিখিতটি করে সেশনটি অ্যাক্সেস করার চেষ্টা করেছি তখন আমি সেই ত্রুটিটি পেয়েছি। এটি এই সত্যটির কারণে H HTTPContext নিয়ন্ত্রণকারী অবজেক্টের অংশ।

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

যাইহোক, আমি যা চেয়েছিলাম তা ছিল HTTPContext যা সিস্টেমের অংশ। ওয়েব নামস্থান। কারণ উপরের উত্তরটি Global.asax.cs এ ব্যবহার করার পরামর্শ দেয়। সুতরাং আমাকে স্পষ্টভাবে নিম্নলিখিতটি করতে হয়েছিল:

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

এটি আমাকে সহায়তা করেছিল, আমি আশেপাশে এমও নয় এমন কিছু করেছি কিনা তা নিশ্চিত নই, তবে আমি আশা করি এটি কারও সাহায্য করবে!


6
System.Web.HttpContext.Current.Session ["blah"] = মান
টমাসজ ইনিউইচজ

21

জায়গা সম্পর্কে "HTTPContext.Current.Sશન" দেখতে অপছন্দ করার কারণে, আমি সেশন ভেরিয়েবলগুলি অ্যাক্সেস করার জন্য একটি সিঙ্গলটন প্যাটার্ন ব্যবহার করি, এটি আপনাকে দৃ strongly়ভাবে টাইপ করা ডেটার ব্যাগ অ্যাক্সেস করার সহজ সুযোগ দেয়।

[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!";

2
সুতরাং এই শ্রেণীর দুটি দায়িত্ব রয়েছে: একটি একক দৃষ্টিকোণ বজায় রাখুন, এবং ভেরিয়েবলগুলি সঞ্চয় করুন ... আমি একটি আইওসি পাত্রে একটি সিঙ্গলটন পেতে ব্যবহার করব।
জোয়েন

1
আপনার যদি ইতিমধ্যে একটি সেটআপ থাকে তবে আমি সম্ভবত একটি সম্পূর্ণ ইনজেক্ট-সক্ষম সেশন পরিষেবাটিও তৈরি করতাম, যদিও, ধারাবাহিকতা সম্ভবত সবচেয়ে বড় সুবিধা, আমি যদি ছোট বৈশিষ্ট্যযুক্ত ওয়েব অ্যাপসটির জন্য এই কোডটি ব্যবহার করতে আগ্রহী তবে .. ওয়েবউইজার্ডস যদি আপনি চান তবে।
মৃত.রবিট

14

আপনি যদি asp.net এমভিসি ব্যবহার করে থাকেন তবে সেশনটি অ্যাক্সেস করার একটি সহজ উপায়।

একটি নিয়ামক থেকে:

{Controller}.ControllerContext.HttpContext.Session["{name}"]

একটি ভিউ থেকে:

<%=Session["{name}"] %>

এটি আপনার সেশন ভেরিয়েবলগুলি অ্যাক্সেস করার অবশ্যই সেরা উপায় নয়, তবে এটি সরাসরি রুট। সুতরাং এটি সাবধানতার সাথে ব্যবহার করুন (অগ্রাধিকার হিসাবে দ্রুত প্রোটোটাইপিংয়ের সময়) এবং উপযুক্ত হয়ে উঠলে একটি র্যাপার / কনটেইনার এবং অনসেশন স্টার্ট ব্যবহার করুন।

আছে HTH


2
এইচএম .. সবচেয়ে ভাল উপায় কোনটি? আমার নিয়ন্ত্রণকারীর সেশন থেকে ভিউস্টেটে ডেটা পাস করা উচিত, উচিত নয়?
RredCat

2
এবং আপনি এই পদ্ধতির সীমাবদ্ধতা ব্যাখ্যা করতে পারেন?
RredCat

1
আমি মনে করি তিনি বোঝাতে চেয়েছিলেন যে পড়া / লেখার পদ্ধতিগুলি সবচেয়ে ভাল। একযোগে / থ্রেড ব্যবহারের উপর নির্ভর করে, আপনার কোনও রেসের শর্ত এড়াতে সেইগুলি পড়তে / লেখার পদ্ধতিতে লক লাগতে পারে।
ডিপস্পেস 101

13

ভাল, আইএমএইচও ..

  1. আপনার ভিউ / মাস্টার পৃষ্ঠার ভিতরে কোনও সেশন রেফারেন্স করবেন না
  2. আপনার সেশনের ব্যবহার হ্রাস করুন। এমভিসি এটির জন্য টেম্পাটা ডেটা আপত্তি সরবরাহ করে, যা মূলত একটি সেশন যা সার্ভারে একক ট্রিপের জন্য বেঁচে থাকে।

# 1 এর সাথে, আমার কাছে দৃ strongly়ভাবে টাইপ করা মাস্টার ভিউ রয়েছে যা সেশন অবজেক্টটি যা কিছু উপস্থাপন করে তা অ্যাক্সেস করার সম্পত্তি রাখে .... আমার উদাহরণে দৃ the়ভাবে টাইপ করা মাস্টার ভিউ জেনেরিক যা আমাকে দৃ strongly়ভাবে টাইপ করা পৃষ্ঠাগুলির সাথে কিছুটা নমনীয়তা দেয়

ViewMasterPage<AdminViewModel>

AdminViewModel
{
    SomeImportantObjectThatWasInSession ImportantObject
}

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

এবং তারপর...

ViewPage<AdminViewModel<U>>

7

যদিও আমি asp.net এমভিসি সম্পর্কে জানি না, তবে একটি সাধারণ। নেট ওয়েবসাইটে আমাদের এটি করা উচিত। এটি এসপ নেটওয়্যার এমভিসি-র জন্যও কাজ করা উচিত।

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

আপনি সহজেই অ্যাক্সেসের জন্য কোনও পদ্ধতির ভিতরে এটি রাখবেন। আছে HTH


7

এটি করার 3 টি উপায় রয়েছে।

  1. আপনি সরাসরি অ্যাক্সেস করতে পারেন HttpContext.Current.Session

  2. আপনি উপহাস করতে পারেন HttpContextBase

  3. এর জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করুন HttpContextBase

আমি তৃতীয় উপায় পছন্দ করি। এই লিঙ্কটি ভাল রেফারেন্স।

বেস / কনট্রোলার বনাম মজক এইচটিটিপি কনটেক্সটবেসে এইচটিটিপি কনটেক্সট সেশন পদ্ধতিগুলি পান / সেট করুন গেট / সেট পদ্ধতিগুলি তৈরি করুন


7

সেশনে অ্যাক্সেস করার আমার উপায়টি হেল্পার ক্লাস লেখার জন্য যা বিভিন্ন ক্ষেত্রের নাম এবং তাদের প্রকারগুলি আবদ্ধ করে। আমি আশা করি এই উদাহরণটি সাহায্য করে:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.SessionState;

namespace dmkp
{
    /// <summary>
    /// Encapsulates the session state
    /// </summary>
    public sealed class LoginInfo
    {
        private HttpSessionState _session;
        public LoginInfo(HttpSessionState session)
        {
            this._session = session;
        }

        public string Username
        {
            get { return (this._session["Username"] ?? string.Empty).ToString(); }
            set { this._session["Username"] = value; }
        }

        public string FullName
        {
            get { return (this._session["FullName"] ?? string.Empty).ToString(); }
            set { this._session["FullName"] = value; }
        }
        public int ID
        {
            get { return Convert.ToInt32((this._session["UID"] ?? -1)); }
            set { this._session["UID"] = value; }
        }

        public UserAccess AccessLevel
        {
            get { return (UserAccess)(this._session["AccessLevel"]); }
            set { this._session["AccessLevel"] = value; }
        }

    }
}

আমি আপনার উত্তরটি পছন্দ করি ... আপনি কী আরও চলছেন তা আরও বিস্তারিতভাবে জানাতে পারেন ... এবং কেন এই থ্রেডের অন্যান্য উত্তরের বিপরীতে এটি আরও ভাল পদ্ধতির।
শেফ_কোড

6

বলছিদের কাছ থেকে দুর্দান্ত উত্তর কিন্তু আমি আপনাকে সদা সতর্ক করব যে সেশনটি সর্বদা নির্ভর করা উচিত। এটি করা দ্রুত এবং সহজ, এবং অবশ্যই এটি কাজ করবে তবে সমস্ত জটিলতায় দুর্দান্ত হবে না।

উদাহরণস্বরূপ, আপনি যদি এমন কোনও দৃশ্যে চলে যান যেখানে আপনার হোস্টিং সেশনটি ব্যবহারের অনুমতি দেয় না বা আপনি যদি কোনও ওয়েব ফার্মে থাকেন, বা ভাগ করা শেয়ারপয়েন্ট অ্যাপ্লিকেশনটির উদাহরণে।

আপনি যদি অন্য কোনও সমাধান চান তবে আপনি আইওসি কনটেইনার যেমন ক্যাসল উইন্ডসর ব্যবহার করে দেখতে পারেন , একটি র‍্যাপার হিসাবে সরবরাহকারী শ্রেণি তৈরি করতে পারেন এবং তারপরে আপনার প্রয়োজনীয়তার উপর নির্ভর করে প্রতি অনুরোধ বা সেশন লাইফস্টাইল ব্যবহার করে আপনার শ্রেণির একটি উদাহরণ রেখে চলেছেন।

আইওসি নিশ্চিত করবে যে প্রতিবার একই ঘটনা ফিরে আসবে।

আরও জটিল হ্যাঁ, আপনার যদি সহজ সমাধানের প্রয়োজন হয় তবে সেশনটি ব্যবহার করুন।

এখানে আগ্রহের বাইরে কিছু বাস্তবায়ন উদাহরণ রয়েছে।

এই পদ্ধতিটি ব্যবহার করে আপনি এর লাইন বরাবর একটি সরবরাহকারী শ্রেণি তৈরি করতে পারেন:

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());
    }

4

আপনি সমস্ত মডেলের জন্য বেস ক্লাস হিসাবে ভিউমোডেলবেস ব্যবহার করতে পারেন, এই শ্রেণিটি সেশন থেকে ডেটা টানতে যত্ন নেবে

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

সেশন ডেটা নিয়ে কাজ করার জন্য আপনি 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  }); 

দ্বিতীয় যুক্তিটি isচ্ছিক হয় যখন সেশনে মান উপস্থিত না হয় তখন কীটির জন্য সেশন ডেটা পূরণ করতে ব্যবহৃত হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.