2009-08-04 13 views
30
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult CreateUser([Bind(Exclude = "Id")] User user) 
{ 
     ... 
     db.SubmitChanges(); 
     ViewData["info"] = "The account has been created."; 
     return RedirectToAction("Index", "Admin"); 
} 

पर व्यूडेटा रखें, यह रीडायरेक्ट टॉक्शन के बाद व्यूडाटा में "जानकारी" टेक्स्ट नहीं रखता है। मैं इस मुद्दे को सबसे सुंदर तरीके से कैसे प्राप्त करूं?RedirectToAction

मेरा वर्तमान विचार सामग्री को इंडेक्स कंट्रोलरेक्शन से [NonAction] में रखना है और इंडेक्स एक्शन और CreateUser क्रिया दोनों में से उस विधि को कॉल करना है, लेकिन मुझे लगता है कि वहां एक बेहतर तरीका होना चाहिए।

धन्यवाद।

उत्तर

57

आप TempData का उपयोग कर सकते हैं।

TempData["info"] = "The account has been created."

TempData इस स्थिति के लिए बिल्कुल मौजूद है। यह सत्र को भंडारण के रूप में उपयोग करता है, लेकिन यह दूसरी प्रतिक्रिया के बाद नहीं होगा।

MSDN से

:

एक TempDataDictionary वस्तु के लिए एक विशिष्ट उपयोग के लिए एक कार्रवाई विधि से डेटा पारित करने के लिए जब यह एक और कार्रवाई विधि पर रीडायरेक्ट है। उदाहरण के लिए, एक क्रिया विधि RedirectToAction विधि को कॉल करने से पहले नियंत्रक की TempData प्रॉपर्टी (जो TempDataDictionary ऑब्जेक्ट देता है) में किसी त्रुटि के बारे में जानकारी संग्रहीत कर सकती है। अगली क्रिया विधि तब त्रुटि को संभाल सकती है और एक दृश्य प्रस्तुत करती है जो एक त्रुटि संदेश प्रदर्शित करती है।

+0

दिलचस्प, इसके बारे में कभी नहीं सुना। :-) –

+2

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

+0

कॉपी एक्सटेंशन विधि http: //blog.eworldui देखें।पीआरजी पैटर्न के लिए नेट/पोस्ट/2008/06/एमवीसी-पोस्ट-रीडायरेक्ट-गेट-नमूना-अपडेटेड.एएसपीएक्स –

10

ViewData का उपयोग करें यदि आपका डेटा View में "इस" अनुरोध के दौरान पहुंच योग्य होना चाहिए। यदि आपका डेटा "अगला" अनुरोध (उदाहरण के लिए POST-REDIRECT-GET design pattern) के लिए है तो 'TempData' का उपयोग करें।

+3

+1 –

2

यदि आपको इसे एक से अधिक बार चाहिए, तो एक अच्छा कामकाज एक्शनफिल्टर एट्रिब्यूट्स बनायेगा जो टेम्पडेटा को व्यूडाटा को निर्यात/आयात करते हैं और इसके विपरीत। आप अपने मॉडलस्टेट को इस तरह से अच्छी तरह से पास कर सकते हैं (प्रदर्शित here - # 13)। कोड के उस टुकड़े में कुछ समायोजन के साथ आपके पास एक साफ समाधान होगा, मुझे लगता है।

0

चूंकि टेम्पपडाटा भंडारण का उपयोग करता प्रतीत होता है, और किसी भी प्रकार का ITempDataProvider जो "इन-प्रोसेस" नहीं है, के लिए ऑब्जेक्ट को Serializable होने की आवश्यकता होती है, TempData वेब खेतों की स्थितियों में अपर्याप्त रूप से अपर्याप्त लगता है ... (ViewDataDictionary स्वयं serializable नहीं है ...) क्या किसी के पास इसके लिए कोई सुझाव है?

2

आप TempData नियंत्रक संपत्ति का उपयोग कर सकते हैं, लेकिन इसका नुकसान यह है कि यह पृष्ठभूमि में सत्र संग्रहण का उपयोग करता है। इसका मतलब है कि आपके पास वेब फार्म पर काम करने के लिए अतिरिक्त काम होगा और आपको अपने आवेदन में सत्रों को पहले स्थान पर सक्षम करने की आवश्यकता होगी।

कुकीज का उपयोग करने का एक विकल्प है यदि आपको केवल एक छोटा संदेश परिवहन करने की आवश्यकता है। इसे कुकी के उचित एन्क्रिप्शन की आवश्यकता होती है। TempData संपत्ति पर भरोसा नहीं करने से आप एक गैर एमवीसी संदर्भ में संदेश सेट करने की अनुमति भी देते हैं, उदाहरण के लिए क्लासिक ASHX पृष्ठ में।

FlashMessage पर एक नज़र डालें जो आपको स्वयं को लागू करने में कुछ काम बचा सकता है।

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