2008-08-05 11 views
113

खोने के बिना ASP.NET MVC में RedirectToAction को स्थितियों (जैसे प्रपत्र प्रस्तुत करने के रूप में) है कि एक RedirectToAction की आवश्यकता हो सकती है।कैसे ASP.NET MVC का उपयोग करते हुए अनुरोध डेटा

ऐसी स्थिति तब होती है जब आपको फॉर्म सबमिशन के बाद सत्यापन त्रुटियों का सामना करना पड़ता है और फ़ॉर्म पर वापस रीडायरेक्ट करने की आवश्यकता होती है, लेकिन यूआरएल फॉर्म के यूआरएल को प्रतिबिंबित करने के लिए चाहते हैं, न कि वह एक्शन पेज जो सबमिट करता है।

जैसा कि मुझे मूल रूप से POST एड डेटा, उपयोगकर्ता सुविधा के साथ-साथ सत्यापन उद्देश्यों के लिए फॉर्म की आवश्यकता होती है, मैं RedirectToAction() के माध्यम से डेटा कैसे पास कर सकता हूं? यदि मैं viewData पैरामीटर का उपयोग करता हूं, तो मेरे POST पैरामीटर GET पैरामीटर में बदल दिए जाएंगे।

+0

यहाँ एक सवाल है कि समान है (उसी विषय पर), लेकिन इस से अलग है। वैसे भी, यह अभी भी इस प्रश्न में रूचि रखने वालों के लिए रूचि रख सकता है: [http://stackoverflow.com/questions/129335/how-do-you-redirecttoaction-using-post-intead-of-get](http:/ /stackoverflow.com/questions/129335/how-do-you-redirecttoaction-using-post-intead-of-get) –

+0

आप क्यों नहीं बस एक ही दृश्य उसमें कोई त्रुटि है, तो वापस नहीं कर रहे हैं? यदि मॉडल मान्य है तो रीडायरेक्ट टॉक्शन आमतौर पर कहा जाता है - या क्या मुझे कुछ याद आ रहा है ?! – niico

उत्तर

76

समाधान वांछित अनुरोध घटकों स्टोर करने के लिए TempData संपत्ति का प्रयोग है।

उदाहरण के लिए:

public ActionResult Send() 
{ 
    TempData["form"] = Request.Form; 
    return this.RedirectToAction(a => a.Form()); 
} 

फिर अपने "प्रपत्र" कार्रवाई में आप जा सकते हैं:

public ActionResult Form() 
{ 
    /* Declare viewData etc. */ 

    if (TempData["form"] != null) 
    { 
     /* Cast TempData["form"] to 
     System.Collections.Specialized.NameValueCollection 
     and use it */ 
    } 

    return View("Form", viewData); 
} 
+1

RedirectToAction (a => a.Form()) MVCv2 का उपयोग करके मेरे लिए संकलित नहीं करता है, क्या आप MVCv3 का उपयोग कर रहे हैं? – ChrisAnnODell

+1

यह प्री-एमवीसी 1 (2008) था। मुझे लगता है कि कुछ चरण में लैम्ब्डा हटा दिए गए थे (एक कोडप्लेक्स प्रोजेक्ट एमवीसीसीन्ट्रिब है जो उन्हें पुन: उत्पन्न करता है, हालांकि आप उस चरण में अपने सहायक गुण का भी उपयोग कर सकते हैं: http: // stackoverflow।com/प्रश्न/1936/कैसे करने वाली redirecttoaction-इन-एएसपी निवल MVC-बिना-हारी-अनुरोध-डाटा/718,653 # 718,653)। एमवीसी 2 में आपको रीडायरेक्ट टॉक्शन ("फॉर्म"), यानी एक स्ट्रिंग के रूप में नाम करने में सक्षम होना चाहिए, हालांकि मुझे याद है कि एमवीसी 2 या 3 ने एमवीसीसीओन्ट्रिब में उसी तरह की एक सहायक विशेषता पेश की है, यदि आप खोज करने के इच्छुक हैं। –

36

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

8

एक और तरीका है जो tempdata से बचा जाता है नहीं है। जिस पैटर्न में मुझे पसंद है, वह मूल रूप से प्रस्तुत करने और अमान्य रूप को फिर से प्रस्तुत करने के लिए 1 कार्यवाही करना शामिल है। यह इस तरह कुछ जाता है:

var form = new FooForm(); 

if (request.UrlReferrer == request.Url) 
{ 
    // Fill form with previous request's data 
} 

if (Request.IsPost()) 
{ 
    if (!form.IsValid) 
    { 
     ViewData["ValidationErrors"] = ... 
    } else { 
     // update model 
     model.something = foo.something; 
     // handoff to post update action 
     return RedirectToAction("ModelUpdated", ... etc); 
    } 
} 

// By default render 1 view until form is a valid post 
ViewData["Form"] = form; 
return View(); 

यह पैटर्न अधिक या कम है। एक छोटा छद्म। इसके साथ आप फ़ॉर्म को प्रतिपादित करने के लिए 1 दृश्य बना सकते हैं, मानों को दोबारा प्रदर्शित कर सकते हैं (क्योंकि फॉर्म पिछले मानों से भरा जाएगा), और त्रुटि संदेश दिखा रहा है।

जब यह कार्रवाई करने के लिए पोस्टिंग, अपने वैध अगर यह नियंत्रण अपने हाथ में एक और कार्रवाई करने के लिए स्थानांतरित कर दिया।

मैं के रूप में हम MVC लिए समर्थन का निर्माण इस पैटर्न .net validation framework में आसान बनाने के लिए कोशिश कर रहा हूँ।

+0

कूल। ऐसा लगता है कि किसी ने पूर्वावलोकन 5 के साथ इस मूल विचार को भी देखा है। –

+0

मैं TempData का भी उपयोग करता हूं, समस्या जिसे मैं समझता हूं, आपके समाधान के साथ डीनो यह है कि यदि उपयोगकर्ता अमान्य डेटा पोस्ट करने के बाद पृष्ठ को रीफ्रेश करना था तो उन्हें "फ़ॉर्म डेटा पुनः सबमिट करना होगा" पुष्टिकरण प्राप्त होगा। TemmData समाधान का उपयोग करते हुए मैटमिशेल कहते हैं कि इस समस्या को समाप्त करता है। – user10479

13

MVCContrib पर एक नजर डालें, तो आप ऐसा कर सकते हैं:

using MvcContrib.Filters; 

[ModelStateToTempData] 
public class MyController : Controller { 
    // 
    ... 
} 
2

आप पुनः निर्देशित कार्रवाई को डेटा पास करना चाहते हैं, विधि आप इस्तेमाल कर सकते हैं है:

return RedirectToAction("ModelUpdated", new {id = 1}); 
// The definition of the action method like public ActionResult ModelUpdated(int id); 
संबंधित मुद्दे