2011-10-03 9 views
8

मैं एक ASP.NET MVC 3 वेब अनुप्रयोग, जहां मैं TempData का उपयोग परिदृश्य में जहाँ उपयोगकर्ता में लॉग इन नहीं कर रहा है में एक मॉडल वस्तु स्टोर करने के लिए, पर काम कर रहा हूँTempData नहीं साफ किया

यहाँ प्रवाह है।:

  1. सबमिट फॉर्म का उपयोग करें।
  2. कोड (विशेष कार्रवाई फ़िल्टर) टेम्पन डेटा में मॉडल जोड़ता है, जो लॉगऑन पेज पर रीडायरेक्ट करता है। जो TempData पढ़ता है और कहता है सीधे

पोस्ट कार्रवाई चरण 3 के बाद

  • उपयोगकर्ता वापस पुनर्निर्देशित कार्रवाई करने के लिए,, मैं सोचा TempData होता साफ हो जाएगा?

    [HttpGet] 
    public ActionResult Foo() 
    { 
        var prefilled = TempData["xxxx"] as MyModel; 
        if (prefilled != null) 
        { 
         return Foo(prefilled); 
        } 
    } 
    
    [HttpPost] 
    [StatefulAuthorize] // handles the tempdata storage and redirect to logon page 
    public ActionResult Foo(MyModel model) 
    { 
        // saves to db.. etc 
    } 
    

    मैं this article पाया जिसमें कहा गया है:

    1. आइटम केवल एक अनुरोध के अंत में TempData से निकाल दिए जाते हैं अगर वे हटाने के लिए चिह्नित किया गया है

      कोड यह रहा।

    2. आइटम केवल पढ़ने के लिए टैग किए जाने के लिए टैग किए जाते हैं।
    3. आइटम TempData को कॉल करके अनचाहे हो सकते हैं। रखें (कुंजी)।
    4. RedirectResult और RedirectToRouteResult हमेशा TempData.Keep() को कॉल करता है।

    अच्छी तरह से इसे TempData["xxx"] के साथ पढ़कर यह "पढ़ा नहीं गया" है और इसलिए उन्हें हटाने के लिए टैग किया जाना चाहिए?

    और आखिरी व्यक्ति मुझे थोड़ा चिंतित करता है - क्योंकि मैं पोस्ट (पी-आर-जी) के बाद रीडायरेक्ट कर रहा हूं। लेकिन इससे बचा नहीं जा सकता है।

    क्या कोई तरीका है कि मैं कह सकता हूं "इस आइटम को हटाएं"। TempData.Remove? या क्या मुझसे यह गलती हो रही है?

  • +0

    आपको एक पूर्ण पुनर्निर्देशन करने की आवश्यकता है और दूसरी क्रिया विधि वापस नहीं करनी है। यही कारण है कि यह काम नहीं कर रहा है। – Buildstarted

    +0

    @ बिल्डल्डस्टार्ट - लेकिन पोस्ट विधि * समाप्त होने के बाद रीडायरेक्ट करता है। आप POST विधि पर रीडायरेक्ट नहीं कर सकते हैं, क्या यह एक GET नहीं होगा? – RPM1984

    +0

    ठीक है, जो सीमित डेटा के आधार पर मैं पढ़ रहा हूं, वह यह है कि आप एक पोस्ट में कोड * प्राप्त करने और पुनर्निर्देशन * कर रहे हैं - कि 'स्टेटफुल प्राधिकृत' नहीं कहा जाएगा। – Buildstarted

    उत्तर

    9

    इसे पढ़ने के ठीक बाद TempData.Remove जोड़कर फिक्स्ड।

    इस बारे में वास्तव में खुश नहीं है। मैंने सोचा कि TempData का पूरा बिंदु यह था कि मैं को ऐसा नहीं करना था।

    मई भी सत्र का उपयोग कर सकते हैं।

    +0

    यह इसे साफ़ करने का तरीका नहीं है। आप TempData के बजाय बहुत अधिक इस्तेमाल सत्र हो सकता है। TempData के साथ केवल लाभ यह है कि यह डेटा स्वयं ही प्रबंधित करता है। जैसा कि मैंने पहले जवाब था, मूल्य केवल साफ कर दिया जाता है जब एक 200 में कार्रवाई परिणाम (इस तरह के ViewResult/ContentResult/JsonResult के रूप में) अन्य सभी स्थितियों में, ठीक किसी भी कार्रवाई का HTTP स्थिति कोड जिसके परिणामस्वरूप 302 (जैसे RedirectAction के रूप में) बनी रहेगी TempData में डेटा। अधिक जानकारी के लिए निम्न http://stackoverflow.com/questions/32571599/asp-net-tempdata-isnt-cleared-even-after-reading-it –

    6

    2 प्राप्त HTTP यहां शामिल अनुरोध नहीं है:

    1. पहले अनुरोध ग्राहक द्वारा भेजे गए और एक पहले अनुरोध के अंत में जो TempData
    2. में कुछ संग्रहीत करता है ग्राहक एक भेजता है लॉगऑन पेज लाने के लिए दूसरा HTTP अनुरोध।

    आपके परिदृश्य में कोई POST अनुरोध शामिल नहीं है। तथ्य यह है कि आपके जीईटी फू एक्शन से आप पोस्ट फू एक्शन का आह्वान कर रहे हैं इसका मतलब यह नहीं है कि एक अलग अनुरोध किया जा रहा है (आप अभी भी प्रारंभिक जीईटी अनुरोध के संदर्भ में हैं)। यह केवल एक सी # विधि कॉल है, एक अलग अनुरोध नहीं है।

    आप पहली बार अनुरोध के दौरान TempData में कुछ की दुकान है और इस TempData दूसरे के लिए उपलब्ध हो जाएगा। तो यह लॉगऑन पेज को प्रस्तुत करने वाले नियंत्रक कार्रवाई में उपलब्ध होगा।

    तो तुम लॉगऑन पेज प्रतिपादन कार्रवाई में TempData से पढ़ा अगर आप चाहते हैं TempData हटा दिया जाना चाहिए चाहिए।

    +0

    आपका सही पढ़ें। लेकिन मुझे लॉगऑन पेज पर इसकी परवाह नहीं है। जब वे साइन इन करते हैं तो मैं "ऑटो पोस्ट" करने की कोशिश कर रहा हूं, इसलिए उन्हें फॉर्म को फिर से सबमिट करने की आवश्यकता नहीं है। यही कारण है कि मैं अपनी पोस्ट कार्रवाई सीधे "कॉलिंग" कर रहा हूं (मुझे पता है कि यह एक अलग अनुरोध नहीं है)। तो मुझे लगता है कि मुझे वास्तव में TempData का उपयोग नहीं करना चाहिए, क्योंकि बाद में 2 अनुरोध हैं जिसके लिए मुझे डेटा की आवश्यकता है, न कि अगले। – RPM1984

    3

    नीचे टेम्पलेट डेटा का उपयोग करते समय ध्यान देने योग्य कुछ महत्वपूर्ण बिंदु हैं।

    1) एक अस्थायी डेटा तक पहुँच को पढ़ने के तुरंत शब्दकोश से आइटम हटा नहीं है, लेकिन केवल हटाने के लिए अंक।

    2) अस्थायी डेटा हमेशा आइटम है कि पहुँचा दिया गया है नहीं निकाला जाएगा। जब यह एक एचटीपी 200 स्टेटस कोड (ViewResult/JsonResult/ContentResult आदि) में एक क्रिया परिणाम देता है तो यह केवल आइटम को हटा देता है।

    3) कार्यों कि एक HTTP 302 (किसी भी कार्रवाई अनुप्रेषित इस तरह के रूप में), डेटा भंडारण में रखा जाता है, तब भी जब इस तक पहुंच में परिणाम के मामले में।

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