दिलचस्प पोस्ट
एसक्यूएल में, आप श्रेणियों में "समूह" कैसे कर सकते हैं? JSON नामकरण कन्वेंशन आर में सफेद स्थान के पहले वर्ण स्ट्रिंग निकालने के लिए gsub का उपयोग करना क्यों MySQL एक विशेषता है जो एसक्यूएल मानकों के साथ संघर्ष जोड़ता है? सी # / .net के लिए अच्छी गुणवत्ता वाले कोड कवरेज के लिए मैं क्या उपयोग कर सकता हूं? वेब ब्राज़र को IE9 में मानकों को कैसे नियंत्रित करें? मैं ASP.NET और SQL सर्वर के बीच एक कनेक्शन पूल समस्या कैसे हल कर सकता हूँ? एक WPF UserControl एक WPF UserControl वार कर सकते हैं? प्लॉट को प्रभावित किए बिना ggplot2 लीजेंड लूक को नियंत्रित करें जब इंटरफेस का उपयोग करना चाहिए? चयनित नोड, उसके लिंक, और उसके बच्चों को डी 3 बल निर्देशित ग्राफ़ में हाइलाइट करें दिनांक ऑब्जेक्ट को कैलेंडर ऑब्जेक्ट में परिवर्तित करना यदि कोई AngularJS टेम्पलेट्स में बयान UIScrollView स्क्रॉल नहीं करें regex और javascript का उपयोग करते हुए html में शब्द हाइलाइट करें – लगभग वहां

एएसपी.नेट एमवीसी में टेम्पटडाटा बनाम सत्र का उपयोग कब किया जाए

मैं एमवीसी फ्रेमवर्क को लटका पाने की कोशिश कर रहा हूं ताकि मेरे साथ रहें।

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

इसलिए, मीटिंग की निजी प्रोफ़ाइल से, एक लॉग इन उपयोगकर्ता के साथ, मेरे पास "ऐड फाइल" लिंक है I FileContoller.Add (int meetingId) के लिए यह लिंक रूट इस क्रिया से, मुझे बैठक मिलती है कि उपयोगकर्ता मीटिंग आईडी का उपयोग करने के लिए फाइलें जोड़ना चाहता है, लेकिन फ़ॉर्म पोस्ट होने के बाद, मुझे अब भी यह जानना होगा कि उपयोगकर्ता किस बैठक में फाइल जोड़ रहा है यही वह जगह है जहाँ मेरा सवाल है, क्या मुझे "वर्तमान में" से सम्मेलन के साथ टेम्पटडाटा के माध्यम से मिलना चाहिए, या इसे सत्र की दुकान में जोड़ना चाहिए?

इस तरह मैं वर्तमान में कार्रवाई जोड़ें सेटअप है, लेकिन यह काम नहीं कर रहा है:

public ActionResult Add(int meetingId) { try { var meeting = _meetingsRepository.GetById(meetingId); ViewData.Model = meeting; TempData[TempDataKeys.CurrentMeeting] = meeting; /* add to tempdata here */ } catch (Exception) { TempData[TempDataKeys.ErrorMessage] = "Unable to add files to this meeting."; return RedirectToRoute("MeetingsIndex"); } return View(); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Add(FormCollection form) { var member = Session[SessionStateKeys.Member] as Member; var meeting = TempData[TempDataKeys.CurrentMeeting] as Meeting; /* meeting ends up null here */ if (member == null) { TempData[TempDataKeys.ErrorMessage] = "You must be logged in to add files to an meeting."; return RedirectToRoute("LoginPage"); } if (meeting == null) { TempData[TempDataKeys.ErrorMessage] = "An error occurred. No meeting selected."; return RedirectToRoute("MeetingsIndex"); } // add files to meeting TempData[TempDataKeys.Notification] = "Successfully added."; return RedirectToRoute("AddFiles", new {meetingId = meeting.MeetingId}); } 

संपादित करें:

अधिकांश उत्तरों के आधार पर, क्या कोई भी एक उदाहरण प्रदान कर सकता है कि किस प्रकार के डेटा (संदेशों के अलावा) को टेम्पाडेटा बनाम सत्र में संग्रहीत किया जाना चाहिए?

वेब के समाधान से एकत्रित समाधान "एएसपी.नेट एमवीसी में टेम्पटडाटा बनाम सत्र का उपयोग कब किया जाए"

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

हालांकि, किसी भी तरह की सुरक्षा के लिए सत्र का उपयोग करना बेहद खतरनाक है। सत्र और सदस्यता पूरी तरह से एएसपी.नेट में अलग हैं I आप अन्य उपयोगकर्ताओं से "चोरी" सत्र कर सकते हैं , और हाँ, लोग इस तरह वेब साइट पर हमला करते हैं इसलिए यदि आप चुनिंदा किसी उपयोगकर्ता के प्रवेश के आधार पर पोस्ट की जानकारी को रोकना चाहते हैं, तो IsAuthenticated देखें , और यदि आप चुनिंदा किस प्रकार के उपयोगकर्ता लॉग इन हैं, के आधार पर जानकारी को दिखाना चाहते हैं, तो आप एक भूमिका प्रदाता का उपयोग कर सकते हैं। क्योंकि GETs को कैश किया जा सकता है, GET में किसी ऐक्शन की पहुंच को चुनने के लिए एकमात्र तरीका AuthorizeAttribute है

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

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

"यह काम नहीं करता है" बहुत वर्णनात्मक नहीं है, लेकिन मुझे कुछ सुझाव दें

हुड के तहत, TempData मूल्यों को स्टोर करने के लिए सत्र का उपयोग करता है। इसलिए भंडारण तंत्र या उस जैसी कुछ चीज़ों के मामले में कोई अंतर नहीं है। हालांकि, केवल अगले अनुरोध प्राप्त होने तक TempData रहता है।

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

आप अपने दृश्य प्रपत्र में सिर्फ एक गुप्त फ़ील्ड के लिए मीटिंग आईडी क्यों नहीं दे सकते हैं? आप पहले से ही मॉडल में इसे जोड़ रहे हैं वैकल्पिक रूप से, इसे अपने रूटर में पैरामीटर के रूप में जोड़ें

आप अपनी आवश्यकता के अनुसार इसे इस्तेमाल कर सकते हैं एक स्पष्टीकरण हो सकता है,

TempData बनाम सत्र

TempData

  1. TempData हमें एकल अनुरोध के अनुरोध के लिए डेटा जारी रखने की अनुमति देता है।
  2. ASP.net एमवीसी स्वचालित रूप से tempdata के मूल्य की समयसीमा समाप्त कर लेगा, एक बार लगातार अनुरोध के परिणाम (इसका मतलब है, केवल लक्ष्य दृश्य पूरी तरह भरी हुई है)।
  3. यह केवल वर्तमान और बाद में अनुरोध के लिए ही मान्य है
  4. TempData TempData के मूल्य को बनाए रखने के लिए विधि रखता है

    उदाहरण:

    TempData.Keep (), TempData.Keep ("EmpName")

  5. TempData आंतरिक रूप से सत्र चर में मान संग्रहीत किया जाता है

  6. इसका इस्तेमाल केवल एक बार संदेश को संचित करने के लिए किया जाता है जैसे सत्यापन संदेश, त्रुटि संदेश आदि।

सत्र:

  1. सत्र अधिक समय तक डेटा संग्रहीत करने में सक्षम है, जब तक कि उपयोगकर्ता का सत्र समाप्त नहीं हो जाता।
  2. सत्र का समय समाप्त होने के बाद सत्र समाप्त हो जाएगा।
  3. यह सभी अनुरोधों के लिए मान्य है
  4. एन / ए
  5. सैशन वेरिएबल सत्रस्थटीइटम कलेक्शन ऑब्जेक्ट में संग्रहीत किया जाता है (जो पृष्ठ के एचटीटीपी कंटेंक्स। सत्र संपत्ति के माध्यम से सामने आया है)।
  6. यह यूजर आईडी, रोल आईडी इत्यादि जैसे लंबे जीवन डेटा को संग्रहीत करने के लिए उपयोग किया जाता है, जो पूरे उपयोगकर्ता सत्र में जरूरी है।

TempData और सत्र, डेटा प्राप्त करने के लिए आवश्यक टाइपकास्टिंग दोनों और रन समय अपवाद से बचने के लिए शून्य मानों की जांच करें।

मैं उस तरह के डेटा को पेज में ही बनाए रखना पसंद करता हूं। मुलाक़ात को छिपे हुए इनपुट के रूप में प्रस्तुत करना, इसलिए इसे नियंत्रक को वापस भेज दिया जाता है। पोस्ट को नियंत्रित करने वाला नियंत्रक तब उस फ़ीड को वापस फ़ीड कर सकता है जो किसी भी दृश्य को प्रस्तुत किया जाएगा, जिससे कि बैठक आईआईटी मूल रूप से जब तक आपको इसकी आवश्यकता होती है,

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

मैं MvcContrib के समाधान का सुझाव दूंगा: http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters- जब- पुनर्निर्देशन- से-एक-क्रिया-से-अन्य /

यदि आप पूर्ण MvcContrib नहीं चाहते हैं, तो समाधान केवल 1 विधि + 1 वर्ग है जिसे आप आसानी से MvcContrib स्रोतों से प्राप्त कर सकते हैं।

TempData संपत्ति मान सत्र स्थिति में संग्रहीत है। टेम्पेडाटा का मान तब तक बनी रहती है जब तक सत्र पढ़े जाने तक या सत्र के समय तक नहीं हो। यदि आप पास डेटा नियंत्रक को दूसरे नियंत्रक दृश्य में देखना चाहते हैं तो आपको टेम्प्डेटा का उपयोग करना चाहिए।

पूरे एप्लिकेशन के लिए डेटा की आवश्यकता होने पर सत्र का उपयोग करें