2008-12-22 13 views
94

मैं AcceptVerbs विधि ASP.NET MVC में प्रपत्र प्रविष्टियों से निपटने के लिए स्कॉट गू की पूर्वावलोकन 5 ब्लॉग पोस्ट में दिए गए विवरण का उपयोग कर रहा:ASP.NET MVC - TempData - अच्छा या बुरा व्यवहार

  • उपयोगकर्ता एक खाली हो जाता है प्राप्त के माध्यम से फार्म
  • उपयोगकर्ता पोस्ट को एक ही कार्रवाई
  • कार्रवाई, डेटा की पुष्टि करता है उचित कार्रवाई लेता है, और कोई नया दृश्य

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

किसी कारण से, मेरे पास TempData का उपयोग करने के लिए एक उलटा है - यह कि कुछ ऐसा डिज़ाइन किया गया है।

क्या यह एक वैध चिंता है, या मैं इसे बना रहा हूं?

+1

अपने 'पुष्टि' कदम को जावास्क्रिप्ट संवाद करने पर विचार करें। कम सर्वर-राउंडट्रिप्स और आप इस समस्या में नहीं भागेंगे। – ajma

उत्तर

24

मैं अस्थायी डेटा के बारे में सोचता हूं कि उपयोगकर्ता को सूचित करने के लिए अग्नि-और-भूल तंत्र है। उन्हें हाल ही में कुछ ऐसा करने का अनुस्मारक देना बहुत अच्छा है, लेकिन मैं कुछ उपयोगकर्ता प्रक्रिया में इसे एक आवश्यक कदम बनाने में भी संकोच करता हूं। अगर वे पृष्ठ को रीफ्रेश करते हैं, तो मेरा मानना ​​है कि यह खत्म हो जाएगा। खैर मुझे लगता है कि मैं इसका उपयोग करने में भी संकोच कर रहा हूं क्योंकि यह वास्तव में अच्छी तरह से परिभाषित नहीं है कि यह कितना विश्वसनीय है।

मुझे आश्चर्य है कि समस्या यह है कि आप पुष्टि चरण से पहले किसी अन्य पृष्ठ पर कार्रवाई को रीडायरेक्ट कर रहे हैं। मुझे आश्चर्य है कि अगर वे पहले जमा करने के बजाय, आप पुष्टि संवाद उत्पन्न करने के लिए पर्याप्त प्रसंस्करण कर सकते हैं, तो मूल पृष्ठ को पुष्टिकरण प्रश्न के साथ वापस कर दें। सत्यापन नियम को छोड़कर आप सत्यापन कैसे कर सकते हैं, इस तरह की जांच करता है कि पुष्टि चरण क्या किया गया था (पुष्टिकरण UI के साथ अन्य सत्यापन पास तक छुपाया गया है)।

2

यह व्यूडाटा का उपयोग करने जैसा है, जिसका अर्थ है कि यह शायद सुरक्षा जोखिम नहीं है। लेकिन मैं TempData की तुलना में ViewData का उपयोग करना चाहूंगा। तुलना के लिए यहां देखें: http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

डिज़ाइन के आधार पर, आप हमेशा उपयोगकर्ता/टोकरी या डेटाबेस में tempdata में जो भी चाहिए उसे स्टोर कर सकते हैं और केवल "IsReady" फ़ील्ड है जो इंगित करता है कि यह पूरा हो गया है या नहीं, यदि आप ध्यान में रखना चाहते हैं तो बाद में इसे विस्तारित करना, ताकि लोग अपने ब्राउज़र बंद कर सकें।

+0

यादृच्छिक downvote? –

+2

नोट: जिस लेख से आप लिंक करते हैं वह अपने समय के लिए अद्यतित था, लेकिन यह केवल एमवीसी 1 के लिए सटीक है। TempData MVC2 में काफी महत्वपूर्ण रूप से बदल गया। – mikemanne

+0

@ मिकमैन, हाँ। लेकिन जवाब 2008 के उत्तरार्ध से है। लेकिन शायद जवाब अपडेट किया जाना चाहिए? –

2

आपके पास ऐसा विचलन क्यों है? यह बात बस अपना काम कर रही है और इसे अच्छी तरह से बना रही है :)

यदि आप इसे गैर-दृढ़ता से टाइप किए जाने के कारण पसंद नहीं करते हैं, तो आप हमेशा एक रैपर बना सकते हैं जो आपको दृढ़ता से टाइप इंटरफ़ेस प्रदान करेगा।

3

मेरे पास एक GetModel विधि है जो पहले TempData ["model"] के लिए जांचती है और उसे वापस कर देती है। अन्यथा GetModel डेटाबेस से उचित डेटा लोड करता है।

यह डेटाबेस से एक अतिरिक्त भार बचाता है जब मेरे पास एक ऐसा कार्य होता है जिसे एक अलग मॉडल को देखने की आवश्यकता होती है जिसके लिए एक ही मॉडल डेटा की आवश्यकता होती है।

+0

याहू, मैंने इसमें भाग लिया है: (1) मान्य होने पर एक रिकॉर्ड मौजूद है, यदि उपयोगकर्ता के लिए प्रदर्शित करने के लिए पृष्ठ (2) लोड रिकॉर्ड पर रीडायरेक्ट करें। इसलिए डेटाबेस सत्यापन और प्रदर्शन के लिए हिट हो जाता है। मैं इसके लिए TempData का उपयोग कर रहा हूं, लेकिन राय की तरह लग रहा था। हालांकि इसे शामिल करने के लिए मुझे आपकी विधि पसंद है। – anonymous

+0

इस परिदृश्य में उचित कैशिंग तंत्र का उपयोग करना बेहतर होगा। – nicodemus13

31

मुझे लगता है कि TempData का उपयोग करने से पहले आपको संकोच करना अच्छा लगता है। TempData सत्र में संग्रहीत किया जाता है और यह आपके लिए प्रभाव हो सकता है यदि:

  1. आप अभी अपनी साइट पर सत्र का उपयोग नहीं करते
  2. आप एक प्रणाली उच्च throughput के लिए पैमाने पर करने की जरूरत है कि आप IE ' सत्र स्थिति से बचने के लिए पसंद करते हैं d पूरी तरह
  3. आप कुकीज़ का उपयोग नहीं करना चाहते हैं (मैं कितनी अच्छी तरह MVC अभी कुकी-सत्र का समर्थन करता है पता नहीं है)

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

+16

TempData को सत्र में संग्रहीत करने की आवश्यकता नहीं है, हालांकि यह डिफ़ॉल्ट प्रदाता है - शायद यही कारण है कि यह विधि दस्तावेज़ में नहीं है। एक कस्टम प्रदाता लिखने के उदाहरण के रूप में, वहां एक कुकी प्रदाता भी है। – FinnNk

76

TempData को कोई उलझन की आवश्यकता नहीं है ... लेकिन अगर सही तरीके से उपयोग नहीं किया जाता है तो यह निश्चित रूप से खराब डिजाइन का संकेत हो सकता है। यदि आप रीस्टफुल यूआरएल का उपयोग कर रहे हैं, तो TempData आपके पोस्ट एक्शन से संदेशों को आपके जीईटी क्रियाओं में स्थानांतरित करने का सबसे अच्छा अभ्यास है। इस पर विचार करें:

आपके पास यूआरएल उत्पाद/नया पर एक फॉर्म है। उत्पाद/निर्माण के लिए फॉर्म पोस्ट, जो फ़ॉर्म को मान्य करता है और उत्पाद बनाता है, सफलता पर नियंत्रक यूआरएल उत्पाद/1 पर रीडायरेक्ट करता है और त्रुटि पर त्रुटि संदेशों को प्रदर्शित करने के लिए उत्पादों/नए पर रीडायरेक्ट करेगा।

उत्पाद/1 केवल उत्पाद के लिए मानक जीईटी कार्रवाई है, लेकिन हम यह प्रदर्शित करने के लिए एक संदेश चाहते हैं कि सम्मिलन सफल रहा। TempData इसके लिए एकदम सही है। पोस्ट कंट्रोलर में TempData को संदेश जोड़ें और यदि दृश्य में तर्क और आपका काम किया गया है तो कुछ डाल दें।

विफलता पर मैं फॉर्म में दर्ज मूल्यों को जोड़ रहा हूं और पोस्ट एक्शन में टेम्पडडेटा में त्रुटि संदेशों का संग्रह और आंतरिक क्रिया प्रोडक्ट्स/न्यू पर रीडायरेक्ट कर रहा हूं। मैंने किसी भी त्रुटि संदेशों के साथ पहले दर्ज किए गए मानों के साथ फ़ॉर्म इनपुट को पॉप्युलेट करने के लिए दृश्य में तर्क जोड़ा है। मुझे अच्छा और साफ लगता है!

+0

जब आप सीधे 'उत्पाद/नई' पर पोस्ट कर सकते हैं तो वह अतिरिक्त काम क्यों करें? 'उत्पाद/बनाएँ' क्या मूल्य जोड़ता है? – mpen

+2

@Mark, उत्पाद/निर्माण का उपयोग करते हुए उस स्थिति को रोकता है जहां उपयोगकर्ता पोस्टबैक के माध्यम से कार्रवाई को पूरा करता है, फिर बाद में रीफ्रेश (या एक बुकमार्क और वापसी) पर कार्रवाई को गलती से पुन: लागू करता है। अधिक जानकारी के लिए, http://en.wikipedia.org/wiki/Post/Redirect/Get – ehdv

+2

@ehdv देखें: लेकिन क्या यह वास्तव में है? सफलता पर यह किसी अन्य पृष्ठ पर रीडायरेक्ट करता है, विफलता पर इसे फ़ॉर्म त्रुटियों को प्रदर्शित करना चाहिए और कोई कार्रवाई नहीं की जानी चाहिए, इसलिए कोई नुकसान नहीं हुआ। यह केवल उस परेशानियों को रोक देगा "क्या आप वाकई संदेश दोबारा पोस्ट करना चाहते हैं", जिसे मैं अक्सर करना चाहता हूं। मुझे लगता है कि यह आपके डिजाइन पर निर्भर करता है, इसलिए मैं आपका बिंदु देख सकता हूं। – mpen

3

एमवीसी 3 में sessionless controllers देखें। यह पता चला कि सत्र का उपयोग एक उपयोगकर्ता के अनुरोधों के समानांतर निष्पादन को रोकता है और इस प्रकार अपर्याप्त प्रदर्शन की ओर जाता है।

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

+2

आप सत्रहीन नियंत्रकों के बारे में सही हैं और TempData सत्र का उपयोग करता है। लेकिन रुकें! सत्र एक बुरी चीज नहीं है और आप सत्र नियंत्रकों के साथ सत्रहीन मिश्रण और मिलान कर सकते हैं। जब आप सर्वर पर (ब्राउज़र से) बहुत सारे AJAX कॉल कर रहे हैं तो आप वास्तव में सत्र_लेस_ नियंत्रक चाहते हैं। जब आप सिर्फ एक पेज-एट-टाइम मारते हैं- .. आपको सत्र रहित होने की आवश्यकता नहीं है। वास्तव में, आपको कोई लाभ नहीं देना चाहिए ... क्योंकि आप केवल सर्वर को मार रहे हैं। तो मिश्रण और मिलान करना संभव है। –

0

सभी अच्छे उत्तरों, क्या आपने इसे संदेश भेजने के लिए देखा है।

TempData और सत्र रीस्टफुल आर्किटेक्चर के लिए सबसे अच्छा विचार नहीं है क्योंकि अधिकांश सत्र स्मृति में संग्रहीत होते हैं। तो जब आप एक सर्वर फार्म का उपयोग करना चाहते हैं, तो उपयोगकर्ता सत्र एक सर्वर पर मौजूद होगा जबकि उनका अगला अनुरोध किसी अन्य सर्वर पर भेजा जा सकता है।

कहा जा रहा है कि यहां संदेश पास करने के लिए टेम्पपडाटा के इस उपयोग पर एक नज़र डालें।

http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/

mabye इस करता है, तो दूसरे पृष्ठ के अलर्ट के लिए पुन: निर्देशन के लिए इस्तेमाल एक क्वेरी स्ट्रिंग दृष्टिकोण का उपयोग करने के लिए अनुकूलित किया जा सकता है।