2013-02-15 46 views
9

एएसपी.नेट एमवीसी 2 में, TempDataDictionary में किसी प्रविष्टि का जीवनकाल केवल एक HTTP अनुरोध था।TempData कार्यान्वयन में परिवर्तन - परिवर्तन के कारण

जिसका अनुवाद एक अनुरोध में रीडायरेक्ट करने, रीडायरेक्ट करने और लाइन के दूसरे छोर पर एक ही आइटम तक पहुंचने के लिए किया गया है। इसके बाद प्रविष्टि अब उपलब्ध नहीं होगी, इस पर ध्यान दिए बिना कि क्या आप लाइन के बाद के अंत में शब्दकोश के मूल्य को पढ़ते हैं या नहीं।

एएसपी.नेट एमवीसी 3 (मुझे विश्वास है) के बाद से, इस कार्यान्वयन विस्तार में काफी बदलाव आया है।

TempDataDictionary में प्रविष्टियां अब पढ़ने के बाद ही हटा दी गई हैं।

MVC 4

public object this[string key] 
    { 
     get 
     { 
     object obj; 
     if (!this.TryGetValue(key, out obj)) 
      return (object) null; 
     this._initialKeys.Remove(key); 
     return obj; 
     } 
    } 

और

public bool TryGetValue(string key, out object value) 
    { 
     this._initialKeys.Remove(key); 
     return this._data.TryGetValue(key, out value); 
    } 

MVC 2:

public object this[string key] { 
      get { 
       object value; 
       if (TryGetValue(key, out value)) { 
        return value; 
       } 
       return null; 
      } 

और

public bool TryGetValue(string key, out object value) { 
      return _data.TryGetValue(key, out value); 
     } 

चूंकि अधिकांश लोग एक अनुरोध में TempData संग्रह में आइटम डालते हैं और तत्काल अगले अनुरोध में तुरंत उन्हें वापस पढ़ते हैं, कार्यक्षमता आश्चर्यजनक रूप से वही दिखाई देती है।

परिदृश्यों में जहां यह एक स्थान पर रीडायरेक्ट होने पर TempData प्रविष्टि को पढ़ने की इच्छा नहीं है, और अन्य संसाधनों का अनुरोध करने और वापस नेविगेट करने पर इसे हटाने की उम्मीद है, तो इस परिवर्तन का काफी असर पड़ता है।

अब एक http अनुरोध के लिए प्रविष्टि उपलब्ध नहीं है लेकिन कई HTTP अनुरोधों पर उपलब्ध है, चाहे वह केवल एक ही शब्दकोश में उपलब्ध हो।

मैं इस प्रत्यारोपण परिवर्तन के बारे में अधिक जानना चाहता हूं, परिवर्तन के कारण क्या थे, क्या यह केवल कई रीडायरेक्टों को पूरा करने के लिए था या क्या गहन लाभ हैं?

उस के माध्यमिक, मुझे यह जानने के लिए उत्सुकता है कि क्या इसमें कुछ भी बनाया गया है, जो डेटा के एकल HTTP अनुरोध साझा करने के लिए कैटर करता है उसी तरह से TempData को पूरा करने के लिए उपयोग किया जाता है?

+0

क्यों एमवीसी 2 'टेम्पडडाटा' को अपने कार्यान्वयन में कॉपी नहीं करें? –

+0

हम मूल रूप से है। –

उत्तर

6

आप सही है कि TempData कुंजी केवल अगर वे (या उपयोगकर्ता के सत्र समाप्त होने के बाद) को पढ़ने किया गया है, लेकिन इस MVC2 के बाद मामले में किया गया है मंजूरी दी जाती है, (http://forums.asp.net/post/3692286.aspx)

मैं चाहूँगा कर रहे हैं इस प्रत्यारोपण परिवर्तन के बारे में और जानने के लिए, परिवर्तन के कारण क्या थे, क्या यह केवल रीडायरेक्ट को पूरा करने के लिए था या क्या गहरे लाभ हैं?

इस परिवर्तन ने एमवीसी 1 में उत्पन्न होने वाली समस्याओं को रोका, जैसे TempData कुंजी पढ़ने से पहले हटाई जा रही थीं। तो हां, प्राथमिक लाभ इन समस्याओं से बचने में है जब आपके पास एकाधिक री-डायरेक्ट, या इंटरलीव किए गए अनुरोध हैं।इसके अलावा, RedirectToRouteResult या RedirectResult विधियों को स्वचालित रूप से TempData.Keep() पर कुंजी को समाशोधन रोकने के लिए स्वचालित रूप से कॉल किया जाता है, यहां तक ​​कि पढ़ने के बाद भी, इसे ध्यान में रखें।

स्थितियों में जहां इस मामले में इस तरह करता है, तो एक ही स्थान पर पर पुनः निर्देशित TempData प्रविष्टि को पढ़ने के लिए चाहते हैं, और यह उम्मीद कर हटा दिया गया है करने के लिए अन्य संसाधनों का अनुरोध करता है, तो और वापस नेविगेट करने के रूप में नहीं है, यह परिवर्तन काफी है एक प्रभाव।

आप सही हैं, अगर आप इस धारणा के तहत कोडिंग कर रहे हैं कि TempData कुंजी स्वचालित रूप से साफ़ हो जाती हैं तो आप अप्रत्याशित समस्याओं में भाग ले सकते हैं। एक विशिष्ट कुंजी को हटाने के लिए TempDataDictionary, या TempData.Remove(key) से सभी कुंजी मैन्युअल रूप से हटाने के लिए आप TempData.Clear() पर कॉल कर सकते हैं। TempDataDictionary से हटाने के लिए इसे ध्वजांकित किए बिना TempData कुंजी के मान को पढ़ने के लिए आप TempData.Peek() का भी उपयोग कर सकते हैं।

कि करने के लिए माध्यमिक, मैं अगर वहाँ कुछ भी कि अब एक ही रास्ता है कि TempData के लिए पूरा करने के लिए प्रयोग किया जाता है में डेटा की एकल HTTP अनुरोध साझा करने के लिए पूरा करता है में बनाया गया है पता करने के लिए intrigued रहा हूँ?

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

+0

धन्यवाद जैक। बहुत उपयोगी। –