2009-04-09 9 views
20

हम इस तरह नियंत्रकों और विचारों में सत्र डेटा का उपयोग कर सकते में सत्र डेटा का उपयोग कैसे करें:ASP.NET MVC - नियंत्रक के अलावा अन्य स्थानों और दृश्य

Session["SessionKey1"] 

कैसे आप के अलावा किसी अन्य वर्ग से सत्र मूल्यों का उपयोग करते हैं एक नियंत्रक या दृश्य?

उत्तर

33

मैं निर्भरता इंजेक्शन का उपयोग करता हूं और उस वर्ग में HttpContext (या केवल सत्र) का उदाहरण पास करता हूं जिसे सत्र तक पहुंच की आवश्यकता होती है। दूसरा विकल्प HttpContext.Current का संदर्भ देना है, लेकिन इससे परीक्षण करना मुश्किल हो जाएगा क्योंकि यह एक स्थिर वस्तु है।

public ActionResult MyAction() 
    { 

     var foo = new Foo(this.HttpContext); 
     ... 
    } 


    public class Foo 
    { 
     private HttpContextBase Context { get; set; } 

     public Foo(HttpContextBase context) 
     { 
      this.Context = context; 
     } 

     public void Bar() 
     { 
      var value = this.Context.Session["barKey"]; 
      ... 
     } 
    } 
+1

जवाब के लिए धन्यवाद। ऐसा लगता है कि कुछ निर्भरता इंजेक्शन ढांचे हैं। आप कौन सी डी ढांचे का सुझाव देते हैं? क्या DI पर कोई लेख पढ़ना आवश्यक है? :) – xraminx

+1

यह मूल पोस्टर के लिए क्या पूछ रहा था के लिए अत्यधिक जटिल लगता है। –

+1

@xraminx - डीआई फ्रेमवर्क के साथ मैं जो सुझाव दे रहा हूं उसे भ्रमित न करें। मैं DI, पैटर्न, ढांचे का उपयोग करने के बारे में बात कर रहा हूं। विचार यह है कि आप कक्षा बनाने के बजाय कक्षा में निर्भरता का एक उदाहरण पास करते हैं या एक स्थिर उदाहरण का उपयोग करते हैं। मॉकिंग के माध्यम से इकाई परीक्षण के लिए बहुत आसान है। – tvanfosson

0

इसे अपने आप को नहीं किया है, लेकिन चाड मेयर की ब्लॉग से यह नमूना (इस पोस्ट से: http://www.chadmyers.com/Blog/archive/2007/11/30/asp.net-webforms-and-mvc-in-the-same-project.aspx) मदद कर सकता है

[ControllerAction] 
public void Edit(int id) 
{ 
    IHttpSessionState session = HttpContext.Session; 

    if (session["LoggedIn"] == null || ((bool)session["LoggedIn"] != true)) 
     RenderView("NotLoggedIn"); 

    Product p = SomeFancyDataAccess.GetProductByID(id); 

    RenderView("Edit", p); 
} 
20

तुम बस HttpContext इसलिए की तरह के माध्यम से कॉल करने की आवश्यकता:

HttpContext.Current.Session["MyValue"] = "Something"; 
+1

@ निक - स्थैतिक HttpContext को मजाक करके यूनिट परीक्षण का प्रयास करें और देखें कि यह कितना आसान है। मैंने यह किया है - नहीं धन्यवाद। – tvanfosson

+2

एफवाईआई - फ्रेमवर्क डिजाइनरों ने ढांचे के नए संस्करणों में HttpSessionStateBase और HttpContextBase की शुरुआत की है और नियंत्रक संदर्भ को संशोधित करके आप नियंत्रक में HttpContext को क्यों बदल सकते हैं इसका एक कारण है। यह इकाई को आपके कार्यों का परीक्षण करना अधिक आसान बनाता है। – tvanfosson

+14

मूल पोस्टर ने परीक्षण के बारे में कभी नहीं पूछा। उन्होंने पूछा कि वह सत्र तक कैसे पहुंच सकता है। –

0

मैं सभी सत्र चर को एक वर्ग फ़ाइल में भी लपेटूंगा। इस तरह आप उन्हें चुनने के लिए intelliSense का उपयोग कर सकते हैं। यह कोड में पेस की संख्या पर कटौती करता है जहां आपको सत्र के लिए "तार" निर्दिष्ट करने की आवश्यकता होती है।

1

इस समस्या के समाधान के लिए मेरा संस्करण यहां है। सूचना है कि मैं भी साथ ही साथ एक निर्भरता इंजेक्शन का उपयोग, केवल प्रमुख अंतर यह है कि "सत्र" वस्तु को एक्सेस करने पर सिंगलटन

फेंक दिया है
private iSession _Session; 

private iSession InternalSession 
{ 
    get 
    { 

     if (_Session == null) 
     {     
      _Session = new SessionDecorator(this.Session); 
     } 
     return _Session; 
    } 
} 
यहाँ

SessionDecorator वर्ग है, जो चारों ओर सत्र रैप करने के लिए एक डेकोरेटर पैटर्न का उपयोग करता है एक अंतरफलक:

public class SessionDecorator : iSession 
{ 
    private HttpSessionStateBase _Session; 
    private const string SESSIONKEY1= "SESSIONKEY1"; 
    private const string SESSIONKEY2= "SESSIONKEY2"; 

    public SessionDecorator(HttpSessionStateBase session) 
    { 
     _Session = session; 
    } 

    int iSession.AValue 
    { 
      get 
     { 
      return _Session[SESSIONKEY1] == null ? 1 : Convert.ToInt32(_Session[SESSIONKEY1]); 
     } 
     set 
     { 
      _Session[SESSIONKEY1] = value; 
     } 
    } 

    int iSession.AnotherValue 
    { 
     get 
     { 
      return _Session[SESSIONKEY2] == null ? 0 : Convert.ToInt32(_Session[SESSIONKEY2]); 
     } 
     set 
     { 
      _Session[SESSIONKEY2] = value; 
     } 
    } 
}` 

आशा इस मदद करता है :)

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