ASP.NET MVC - टेंपडाटा - अच्छा या बुरा अभ्यास


96

मैं AcceptVerbsASP.NET MVC में फ़ॉर्म प्रविष्टियों से निपटने के लिए स्कॉट गु के पूर्वावलोकन 5 ब्लॉग पोस्ट में विस्तृत विधि का उपयोग कर रहा हूं :

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

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

किसी कारण से, मेरे पास उपयोग करने के लिए एक विरोधाभास है TempData- कि यह चारों ओर डिज़ाइन किया जाना है।

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


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

जवाबों:


26

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

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


77

TempData के लिए कोई विरोध करने की आवश्यकता नहीं है ... लेकिन अगर सही तरीके से उपयोग नहीं किया गया तो यह निश्चित रूप से खराब डिज़ाइन का संकेत हो सकता है। यदि आप RESTful URL का उपयोग कर रहे हैं, तो TemPData आपके पोस्ट एक्ट्स से संदेशों को अपने GET एक्शन में ट्रांसफर करने के लिए एक सर्वोत्तम अभ्यास है। इस पर विचार करो:

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

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

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


जब आप सीधे पोस्ट कर सकते हैं तो वह अतिरिक्त काम क्यों करें Products/New? क्या मूल्य Products/Createजोड़ता है?
एमपीएन

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

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

31

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

  1. आप अभी अपनी साइट पर सत्र का उपयोग नहीं करते हैं
  2. आपके पास एक प्रणाली है जिसे उच्च थ्रूपुट के पैमाने पर रखने की आवश्यकता है, अर्थात आप सत्र राज्य से पूरी तरह बचना पसंद करेंगे
  3. आप कुकीज़ का उपयोग नहीं करना चाहते हैं (मुझे नहीं पता कि MVC अभी कुकलेस सत्रों का कितना समर्थन करता है)

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


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

3

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

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


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

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

3

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

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


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

2

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

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


2

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

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


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

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

0

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

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

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.