2010-04-15 10 views
7

यदि मैं पृष्ठ को शुरू करने के लिए टेम्पपडेटा पास करने वाले किसी नए पृष्ठ पर रीडायरेक्ट करता हूं तो यह ठीक काम करता है, हालांकि यदि उपयोगकर्ता अपने ब्राउज़र में रीफ्रेश बटन दबाता है तो TempData अब उपलब्ध नहीं है। यह देखते हुए, क्या ऐसी कोई स्थिति है जहां TempData का विश्वसनीय रूप से उपयोग किया जा सकता है?
या उपयोगकर्ताओं को ताज़ा करने की समस्या को कम करने या कम करने का कोई तरीका?एएसपी.नेट एमवीसी ब्राउज़र रीफ्रेश करता है TempData बेकार बनाते हैं?

उत्तर

12

एमवीसी 1 में, हाँ, एक कुंजी स्टोर करने के बाद अगले अनुरोध के बाद अस्थायी डेटा खो जाता है।

एमवीसी 2 के साथ, हालांकि, इसका उपयोग करने के पहले प्रयास के बाद अस्थायी डेटा खो गया है।

आप हमेशा टेप डेटा डेटा हानि समस्या को हल करने के लिए, सत्र का उपयोग कर सकते हैं, जो TempData किसी भी तरह का उपयोग करता है।

MVC 2 बीटा रिलीज नोट्स से:

TempDataDictionary सुधार

TempDataDictionary वर्ग के व्यवहार पते के परिदृश्यों को थोड़ा बदल दिया गया है, जहां अस्थायी डेटा था या तो समय से पहले ही हटा दिया है या आवश्यक से अधिक लंबे समय तक जारी रहा। उदाहरण के लिए, उन मामलों में जहां temp डेटा उसी अनुरोध में पढ़ा गया था जिसमें सेट किया गया था, अगले अनुरोध के लिए अस्थायी डेटा जारी रहा था, भले ही इरादा इसे निकालना था। अन्य मामलों में, कई डेटा रीडायरेक्ट में अस्थायी डेटा जारी नहीं था।

इन परिदृश्यों को संबोधित करने के लिए, TempDataDictionary वर्ग बदल दिया गया जिससे सभी कुंजियों जीवित रहने के अनिश्चित काल तक कुंजी TempDataDictionary वस्तु से पढ़ा जाता है। Keep विधि को TempDataDictionary में इंगित करने के लिए जोड़ा गया था कि पढ़ने को पढ़ने के बाद को हटाया जाना चाहिए। RedirectToActionResult एक उदाहरण है जहां में Keep विधि को के लिए सभी अनुरोधों को बनाए रखने के लिए कॉल विधि कहा जाता है।

आप भी इन परिवर्तनों को देखने के MVC 2 स्रोत में सीधे देख सकते हैं:

MVC 1:

public object this[string key] { 
     get { 
      object value; 
      if (TryGetValue(key, out value)) { 
       return value; 
      } 
      return null; 
     } 
     set { 
      _data[key] = value; 
      _modifiedKeys.Add(key); 
     } 
    } 

MVC 2:

public object this[string key] { 
     get { 
      object value; 
      if (TryGetValue(key, out value)) { 
       _initialKeys.Remove(key); 
       return value; 
      } 
      return null; 
     } 
     set { 
      _data[key] = value; 
      _initialKeys.Add(key); 
     } 
    } 
+0

यह अब मूल्य तक पहुंचने पर आधारित है? मैं उस चेंजलॉग को याद किया। –

+0

हाँ, क्या आप पहले पहुंच प्रयास पर TempData खोने के लिए एक संदर्भ प्रदान कर सकते हैं? – Omar

+0

@Nathan Taylor @Baddie, आशा है कि मेरे संपादन और उद्धरण आपकी चिंताओं को हटा दें। – jfar

-1

TempData दुकान के लिए विशेष रूप से मौजूद है केवल एक पेज लोड/एक्शन/रीडायरेक्ट के लिए डेटा। यदि आपको ताज़ा करने के बाद जारी रखने के लिए डेटा की आवश्यकता है तो आपको इसे व्यूडेटा संग्रह में रखना चाहिए, जब तक कि रीफ्रेश अनुरोध की सेवा करने वाली कार्रवाई वही है जैसा प्रारंभ में अनुरोध किया गया था (यानि रीडायरेक्ट से पहले व्यूडेटा मान जोड़ा नहीं गया था) ।

+3

व्यूडेटा का उपयोग कर डेटा दृढ़ता के बारे में आपका बयान गलत है। दृश्य उत्पन्न होने पर व्यूडेटा का दायरा समाप्त होता है। ताज़ा करना बस कार्रवाई को फिर से चालू करता है और व्यूडेटा पुन: उत्पन्न होता है, कुछ भी नहीं रहता है। – Omar

+0

शायद मैंने अपना अर्थ अस्पष्ट किया कि मैंने इसे कैसे समझाया। मैं यह कह रहा था कि रीफ्रेश के माध्यम से मूल्य को व्यूडेटा में फिर से जोड़ा जाएगा। –

0

आपकी समस्या का समाधान करने वाली एकमात्र विशेषताएं Cache और Session है।

ViewData दृश्य उत्पन्न होने पर अनिवार्य रूप से 'मर जाता है'।

यदि आप जो कुछ हासिल करने की कोशिश कर रहे हैं उस पर अधिक जानकारी प्रदान कर सकते हैं, तो शायद एक और समाधान दिया जा सकता है, हालांकि, ऐसा लगता है कि Session या Cache का उपयोग करना आपके लिए सबसे अच्छा विकल्प है।

+0

अंत में मैंने एक पूरी तरह से अलग दृष्टिकोण लिया और क्वेरी स्ट्रिंग पर डेटा पारित किया (यह केवल कुछ चर था लेकिन अभी भी सबसे सुरुचिपूर्ण समाधान नहीं है) – Myster

2

एमवीसी 1 में दी गई स्थिति के लिए एक कामकाज दूसरे नियंत्रक में TempData को फिर से असाइन करना होगा। बेशक यह सिस्टम में थोड़ा और समय के लिए डेटा बनी हुई है। लेकिन यह ताज़ा मुद्दे को हल करता है।

+0

क्या यह कार्यवाही एमवीसी 2 पर भी लागू होती है? – Myster

+2

इसे एमवीसी 2 में भी काम करना चाहिए। लेकिन प्रभावों के बारे में सुनिश्चित नहीं है क्योंकि यह फिर से पढ़ा नहीं जाता है, यह अनिश्चित काल तक जारी रह सकता है। – ravi

18

आप अपने नियंत्रक में

TempData.Keep("nameofthedata"); 

लिखना चाहिए, तो यह भी ताज़ा स्थितियों में है कि डेटा रखेंगे।

1

टेम्पडडाटा रीडायरेक्ट में उपयोग किया जाता है ताकि यदि आप पृष्ठ को रीफ्रेश कर रहे हैं जिसका अर्थ है कि आप सर्वर से अलग अनुरोध कर रहे हैं, इसलिए आपका डेटा खो गया है। इस डेटा को जारी रखने के लिए Tempdata.Keep ("KeyofTempdata") विधि को उस क्रिया में कॉल करें जिसमें आप रीडायरेक्ट कर रहे हैं। यदि आप डेटा का उपयोग Tempdata.Remove ("KeyofTempdata") को हटाना चाहते हैं।

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