2011-03-26 25 views
10

से TempData तक पहुंचने से मैं HttpContext.Current से TempData तक कैसे पहुंच सकता हूं?HttpContext.Current

+0

आप इस समस्या का समाधान मिला? – trailmax

उत्तर

0

HttpContext.Current से आप TempData तक नहीं पहुंच सकते/नहीं। आपको एक नियंत्रक उदाहरण की आवश्यकता है। दुर्भाग्यवश क्योंकि आपने अपने परिदृश्य को समझाया नहीं है और आपको ऐसा करने की आवश्यकता क्यों है, मैं आपको बेहतर विकल्प प्रदान नहीं कर सकता।

+9

मैं एक ऐसी कक्षा बना रहा हूं जो TempData को एक दोस्ताना/प्रकार सुरक्षित तरीके से लपेटता है। यह आंतरिक रूप से TempData का उपयोग करता है, लेकिन मैं उस तथ्य का पर्दाफाश नहीं करना चाहता हूं। मैं TempData को 'new MyTempDataWrapper (this.TempData)' में पास नहीं करना चाहता हूं। यदि TempData सत्र और सत्र में संग्रहीत है, तो HttpContext.Current से पहुंच योग्य है, मैं क्यों HttpContext.Current से TempData तक पहुंच नहीं पा रहा हूं? – BowserKingKoopa

0

अन्य उत्तर पर अपनी टिप्पणी को संबोधित करते हुए, आप अपना खुद का ITempDataProvider लागू कर सकते हैं और उसके बाद नियंत्रक को इसका उपयोग करने के लिए ओवरराइड कर सकते हैं। Mvc3Futures में कुकी TempDataProvider क्लास पर नज़र डालें जो सत्र के बजाए कुकीज़ में tempdata संग्रहीत करता है यह देखने के लिए कि यह कैसे संभव है।

http://volaresystems.com/Blog/post/2011/06/30/Sessionless-MVC-without-losing-TempData.aspx

बल्कि बदलते जहां tempdata संग्रहीत किया जाता है की तुलना में अपने क्रियान्वयन SessionCookieTempDataProvider से संभव इनहेरिट और बस प्रकार सुरक्षित तरीकों इसे करने के लिए जोड़ सकते हैं।

1

यदि आप अपने स्वयं के डिज़ाइन निर्णयों के कारण पैरामीटर के रूप में संदर्भ ऑब्जेक्ट को पास किए बिना ऐसा करना चाहते हैं, तो आप कम से कम [थ्रेडस्टैटिक] अपने स्वयं के वैश्विक स्थैतिक वर्ग पर उपयोग कर सकते हैं। यह संपत्ति एक्सेस किए गए सदस्यों के लिए भरोसेमंद हो सकता है जो बदले में ऐसे थ्रेडस्टैटिक पैरामीटर पर निर्भर होना चाहिए, क्योंकि वे कार्य नहीं कर रहे हैं।

थ्रेडस्टैटिक पैरामीटर को पास करने की आवश्यकता के बिना दूरस्थ स्टैक फ्रेम में समान थ्रेड पर संसाधनों को साझा करने में सहायता कर सकता है। HttpContext.Current इसे प्राप्त करने के लिए थ्रेडस्टैटिक का उपयोग करता है।

एक नियमित एमवीसी नियंत्रक कक्षा आपके लिए यह नहीं करेगी। तो आपको अपने प्रोजेक्ट में सभी नियंत्रकों के लिए उत्तराधिकारी के लिए अपनी कक्षा बनाने की आवश्यकता होगी।

public class MyController : Controller 
{ 
    public MyController() 
    { 
    _Current = this; 
    } 

    [ThreadStatic] 
    public static RacerController _Current = null; 

    public static RacerController Current 
    { 
     get 
     { 
      var thisCurrent = _Current; //Only want to do this ThreadStatic lookup once 
      if (thisCurrent == null) 
       return null; 
      var httpContext = System.Web.HttpContext.Current; 
      if (httpContext == null) //If this is null, then we are not in a request scope - this implementation should be leak-proof. 
       return null; 

      return thisCurrent; 
     } 
    } 

    protected override void Dispose(bool disposing) 
    { 
    _Current = null; 
    base.Dispose(disposing); 
    } 
} 

उपयोग:

var thisController = MyController.Current; //You should always save to local variable before using - you'll likely need to use it multiple times, and the ThreadStatic lookup isn't as efficient as a normal static field lookup. 
var value = thisController.TempData["key"]; 
thisController.TempData["key2"] = "value2"; 
संबंधित मुद्दे