2008-10-24 10 views
70

ASP.NET C# में सत्र चर के अस्तित्व की जांच करने का सबसे अच्छा तरीका क्या है?सत्र चर निर्धारित करने का सबसे अच्छा तरीका सी # में शून्य या खाली है?

मुझे String.IsNullOrEmpty स्ट्रिंग के लिए काम करना पसंद है और आश्चर्य हुआ कि Session के लिए एक समान विधि थी। वर्तमान में एक ही तरीका है मुझे पता है की है:

var sSession; 
if (Session["variable"] != null) 
{ 
    sSession = Session["variable"].ToString(); 
} 
else 
{ 
    sSession = "set this"; 
    Session["variable"] = sSession; 
} 

उत्तर

106

क्या अन्य लोगों ने कहा से पर का पालन करें। मेरे पास दो परतें हैं:

कोर परत। यह एक डीएलएल के भीतर है जो लगभग सभी वेब ऐप परियोजनाओं में जोड़ा जाता है। इसमें मेरे पास सत्र सत्र वर्ग है जो सत्र राज्य गेटर्स/सेटर्स के लिए कड़वाहट का काम करता है। इसमें निम्नलिखित कोड शामिल हैं:

public class SessionVar 
{ 
    static HttpSessionState Session 
    { 
     get 
     { 
      if (HttpContext.Current == null) 
       throw new ApplicationException("No Http Context, No Session to Get!"); 

      return HttpContext.Current.Session; 
     } 
    } 

    public static T Get<T>(string key) 
    { 
     if (Session[key] == null) 
      return default(T); 
     else 
      return (T)Session[key]; 
    } 

    public static void Set<T>(string key, T value) 
    { 
     Session[key] = value; 
    } 
} 

किसी भी प्रकार के लिए जेनेरिक नोट करें।

मैं फिर विशिष्ट प्रकारों के लिए गेटर्स/सेटर्स भी जोड़ता हूं, विशेष रूप से स्ट्रिंग क्योंकि मैं अक्सर स्ट्रिंग के साथ काम करना पसंद करता हूं। उपयोगकर्ताओं को प्रस्तुत चर के लिए शून्य के बजाय लक्षण।

ई।छ:

public static string GetString(string key) 
{ 
    string s = Get<string>(key); 
    return s == null ? string.Empty : s; 
} 

public static void SetString(string key, string value) 
{ 
    Set<string>(key, value); 
} 

और इसी तरह ...

मैं तो सार करने के लिए रैपर बनाने कि दूर और आवेदन मॉडल के लिए इसे लाने के लिए।

public class CustomerInfo 
{ 
    public string Name 
    { 
     get 
     { 
      return SessionVar.GetString("CustomerInfo_Name"); 
     } 
     set 
     { 
      SessionVar.SetString("CustomerInfo_Name", value); 
     } 
    } 
} 

आप विचार सही: उदाहरण के लिए, अगर हम ग्राहक विवरण है? :)

नोट: स्वीकार्य उत्तर पर टिप्पणी जोड़ने पर बस एक विचार था। हमेशा एक सर्वर सर्वर का उपयोग करते समय सत्र में उन्हें संग्रहीत करते समय ऑब्जेक्ट्स क्रमबद्ध होते हैं। जब वेब फार्म पर जेनिक्स का उपयोग करके ऑब्जेक्ट को आजमाने और सहेजना बहुत आसान हो सकता है और यह तेजी से बढ़ता है। मैं काम पर एक वेब फार्म पर तैनात करता हूं ताकि यह देखने के लिए कि कोर ऑब्जेक्ट सीरियलज़ेबल है या नहीं, यह देखने के लिए कोर लेयर में मेरे कोड पर चेक जोड़ा गया है, सत्र गेटर्स और सेटर को एन्सेप्लेट करने का दूसरा लाभ :)

+1

पूरी तरह से उत्तर देने के लिए धन्यवाद। बहुत अच्छा! –

+0

कोई समस्या नहीं, एचटीएच:) –

+0

ग्रेट दृष्टिकोण! मैं लंबे समय से कुछ इसी तरह का उपयोग कर रहा हूं, लेकिन जेनेरिक शामिल नहीं किया था। यह अलग-अलग डेवलपर्स के साथ समान सत्र चर बनाने वाली कई समस्याओं से बचाता है। – DOK

17

कि काफी तुम कैसे करते है। हालांकि, एक छोटा वाक्यविन्यास है जिसका आप उपयोग कर सकते हैं।

sSession = (string)Session["variable"] ?? "set this"; 

यह तो सत्र चर अशक्त, सेट sSession है कह रहा है "सेट इस"

+1

आप यह नहीं कर सकते ... सत्र ["परिवर्तनीय"] एक ऑब्जेक्ट है और संकलक इसे स्ट्रिंग में परिवर्तित कर देगा क्योंकि सत्र सत्र ["परिवर्तनीय"] मौजूद नहीं है, इसलिए सत्र एक स्ट्रिंग है, यह एक अपवाद फेंकता है! – balexandre

+0

आप बिल्कुल सही हैं। यदि सत्र शून्य नहीं है तो मैंने स्ट्रिंग को कास्ट करने के लिए कोड अपडेट किया। – Ely

1

कुछ भी नहीं/अशक्त के लिए जांच की जा रही जिस तरह से यह करने के लिए है।

ऑब्जेक्ट प्रकारों से निपटने का तरीका नहीं है। एक सख्त प्रकार घोषित करें और ऑब्जेक्ट को सही प्रकार पर डालने का प्रयास करें। (और कलाकारों संकेत का उपयोग करें या कन्वर्ट)

private const string SESSION_VAR = "myString"; 
string sSession; 
if (Session[SESSION_VAR] != null) 
{ 
    sSession = (string)Session[SESSION_VAR]; 
} 
else 
{ 
    sSession = "set this"; 
    Session[SESSION_VAR] = sSession; 
} 

किसी भी वाक्य रचना के उल्लंघन के लिए क्षमा करें, मैं एक दैनिक VB'er

0

आप .NET 3.5 का उपयोग कर रहे हैं? एक IsNull विस्तार विधि बनाएं:

public static bool IsNull(this object input) 
{ 
    input == null ? return true : return false; 
} 

public void Main() 
{ 
    object x = new object(); 
    if(x.IsNull) 
    { 
     //do your thing 
    } 
} 
+1

यह लिखा जा सकता है: सार्वजनिक स्थैतिक बूल है (यह ऑब्जेक्ट इनपुट) { वापसी इनपुट == शून्य; } –

+0

आपको विस्तार विधियों से सावधान रहना चाहिए। –

+1

मुझे एक्सटेंशन विधियों से सावधान क्यों रहना चाहिए? –

0

यदि आप जानते हैं कि यह एक स्ट्रिंग है, तो आप String.IsEmptyOrNull() फ़ंक्शन का उपयोग कर सकते हैं।

14

यह किसी संपत्ति में इसे लपेटने के लिए चीजों को और अधिक सुरुचिपूर्ण बना सकता है।

string MySessionVar 
{ 
    get{ 
     return Session["MySessionVar"] ?? String.Empty; 
    } 
    set{ 
     Session["MySessionVar"] = value; 
    } 
} 

तो आप इसे एक स्ट्रिंग के रूप में देख सकते हैं।

if(String.IsNullOrEmpty(MySessionVar)) 
{ 
    // do something 
} 
+0

यह वही है जो मैं करता हूं, ऐप में सत्र वर्र्स तक पहुंचना अधिक आसान बनाता है। मैं डेटा के लिए कक्षाएं बनाते हैं, और स्थैतिक गुण जो सभी शून्य जांच गड़बड़ी करते हैं। –

+0

क्या होगा यदि आप सत्र में किसी ऑब्जेक्ट को संग्रहीत कर रहे हैं न केवल एक स्ट्रिंग? –

+1

मेरा उत्तर देखें, जेनेरिकों का उपयोग अन्य वस्तुओं को संग्रहीत करते समय टाइप-सुरक्षा सक्षम बनाता है। –

1

आमतौर पर मैं सत्र में मदों के लिए दृढ़ता से टाइप किया गुणों के साथ SessionProxy पैदा करते हैं। कोड जो इन गुणों तक पहुंचता है, वह शून्यता के लिए जांच करता है और उचित प्रकार के कास्टिंग करता है। इसके बारे में अच्छी बात यह है कि मेरे सभी सत्र संबंधित आइटम एक ही स्थान पर रखे जाते हैं। मुझे कोड के विभिन्न हिस्सों में अलग-अलग कुंजियों का उपयोग करने की चिंता करने की ज़रूरत नहीं है (और सोच रहा है कि यह क्यों काम नहीं करता है)। और निर्भरता इंजेक्शन और मॉकिंग के साथ मैं पूरी तरह से यूनिट परीक्षणों के साथ परीक्षण कर सकता हूं। यदि DRY सिद्धांतों का पालन करता है और मुझे उचित डिफ़ॉल्ट परिभाषित करने देता है।

public class SessionProxy 
{ 
    private HttpSessionState session; // use dependency injection for testability 
    public SessionProxy(HttpSessionState session) 
    { 
     this.session = session; //might need to throw an exception here if session is null 
    } 

    public DateTime LastUpdate 
    { 
     get { return this.session["LastUpdate"] != null 
         ? (DateTime)this.session["LastUpdate"] 
         : DateTime.MinValue; } 
     set { this.session["LastUpdate"] = value; } 
    } 

    public string UserLastName 
    { 
     get { return (string)this.session["UserLastName"]; } 
     set { this.session["UserLastName"] = value; } 
    } 
} 
7

सी # 3.0 में 'as' नोटेशन है बहुत साफ। चूंकि सभी सत्र चर नलिका ऑब्जेक्ट्स हैं, इससे आपको मान को पकड़ने और अपवाद फेंकने की चिंता किए बिना इसे अपने स्वयं के टाइप किए गए चर में डाल दिया जाता है। अधिकांश वस्तुओं को इस तरह से संभाला जा सकता है।

string mySessionVar = Session["mySessionVar"] as string; 

मेरे अवधारणा है कि आप स्थानीय चर में अपने सत्र चर खींच चाहिए और फिर उन्हें उचित रूप से निपटने है। हमेशा मान लें कि आपका सत्र चर शून्य हो सकता है और उन्हें कभी भी एक गैर-शून्य प्रकार में नहीं डाला जा सकता है।

यदि आपको एक गैर-शून्य टाइप किए गए चर की आवश्यकता है तो आप इसे प्राप्त करने के लिए TryParse का उपयोग कर सकते हैं।

int mySessionInt; 
if (!int.TryParse(mySessionVar, out mySessionInt)){ 
    // handle the case where your session variable did not parse into the expected type 
    // e.g. mySessionInt = 0; 
} 
1

मैं गुणों में सत्र चर को लपेटना भी पसंद करता हूं। यहां सेटर्स छोटे हैं, लेकिन मुझे प्राप्त विधियां लिखना पसंद है ताकि उनके पास केवल एक निकास बिंदु हो। ऐसा करने के लिए मैं आमतौर पर शून्य चर की जांच करता हूं और सत्र चर के मान को वापस करने से पहले इसे डिफ़ॉल्ट मान पर सेट करता हूं। कुछ इस तरह:

string Name 
{ 
    get 
    { 
     if(Session["Name"] == Null) 
      Session["Name"] = "Default value"; 
     return (string)Session["Name"]; 
    } 
    set { Session["Name"] = value; } 
} 

}

2

मेरी राय में, इस जो स्पष्ट और पढ़ने के लिए आसान है करने के लिए सबसे आसान तरीका है:

String sVar = (string)(Session["SessionVariable"] ?? "Default Value"); 

यह सबसे कारगर नहीं हो सकता है विधि, क्योंकि यह डिफ़ॉल्ट के मामले में भी डिफ़ॉल्ट स्ट्रिंग मान रखती है (स्ट्रिंग के रूप में स्ट्रिंग कास्टिंग), लेकिन यदि आप इसे मानक कोडिंग अभ्यास करते हैं, तो आप पाते हैं कि यह सभी डेटा प्रकारों के लिए काम करता है, और आसानी से पठनीय है।

उदाहरण के लिए (एक पूरी तरह से फर्जी उदाहरण है, लेकिन यह बात से पता चलता):

DateTime sDateVar = (datetime)(Session["DateValue"] ?? "2010-01-01"); 
Int NextYear = sDateVar.Year + 1; 
String Message = "The Procrastinators Club will open it's doors Jan. 1st, " + 
        (string)(Session["OpeningDate"] ?? NextYear); 

मैं जेनेरिक्स विकल्प पसंद है, लेकिन यह overkill की तरह लगता है जब तक आप हर जगह इस आवश्यकता की उम्मीद है। एक्सटेंशन विधि को विशेष रूप से सत्र ऑब्जेक्ट को विस्तारित करने के लिए संशोधित किया जा सकता है ताकि उसके पास सत्र "स्ट्रिंग इफनुल (" सत्र वार ") और सत्र [" सत्र वार "] =" myval "जैसे" सुरक्षित "विकल्प हो; यह सत्र ["सत्रवार"] के माध्यम से चर का उपयोग करने की सादगी को तोड़ता है, लेकिन यह साफ़ कोड है, और यदि आपको आवश्यकता हो तो शून्य या स्ट्रिंग को सत्यापित करने की अनुमति देता है।

1

इस विधि भी मान लें कि यह नहीं है कि सत्र चर में वस्तु एक स्ट्रिंग

if((Session["MySessionVariable"] ?? "").ToString() != "") 
    //More code for the Code God 

है तो मूल रूप से एक स्ट्रिंग के लिए यह ToString के बाद से परिवर्तित करने से पहले एक खाली स्ट्रिंग के साथ अशक्त चर की जगह Object का हिस्सा है कक्षा

संबंधित मुद्दे

 संबंधित मुद्दे