अनुरोध डेटा खोए बिना ASP.NET MVC में पुनर्निर्देशन कैसे करें


123

ASP.NET MVC के उपयोग से ऐसी स्थितियाँ (जैसे कि फॉर्म सबमिशन) होती हैं जिनकी आवश्यकता हो सकती है a RedirectToAction

ऐसी ही एक स्थिति तब होती है जब आप फॉर्म सबमिट करने के बाद सत्यापन त्रुटियों का सामना करते हैं और फॉर्म को वापस रीडायरेक्ट करने की आवश्यकता होती है, लेकिन यूआरएल को फॉर्म के URL को प्रतिबिंबित करना होगा, न कि उस कार्रवाई पृष्ठ को जो इसे सबमिट करता है।

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


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

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

जवाबों:


81

समाधान वांछित अनुरोध घटकों को संग्रहीत करने के लिए 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 का उपयोग कर रहे हैं?
क्रिसनाडेल

1
यह प्री-एमवीसी 1 (2008) था। लैंबडास को किसी ऐसे चरण में हटा दिया गया है, जो मुझे विश्वास है कि (एक कोडप्लेक्स प्रोजेक्ट MVCContrib है जो उन्हें फिर से प्रस्तुत करता है, हालांकि आप उस चरण में उनके सहायक विशेषता का उपयोग कर सकते हैं: stackoverflow.com/questions/1936 (...... )। Mvc2 में आपको RedirectToAction ("फ़ॉर्म"), अर्थात एक स्ट्रिंग के रूप में नाम देने में सक्षम होना चाहिए, हालांकि मैं शिथिल रूप से याद करता हूं कि MVC 2 या 3 ने MVCContrib में उसी तरह की सहायक विशेषता पेश की है यदि आप खोज करने के लिए उत्सुक हैं।
मैट मिशेल

37

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



8

एक और तरीका है जो टेंपडाटा से बचा जाता है। मुझे जो पैटर्न पसंद है उसमें मूल रेंडर और अमान्य फॉर्म के पुन: रेंडर दोनों के लिए 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 सत्यापन ढांचे में आसान बनाने की कोशिश कर रहे हैं ।


मैं TempData का उपयोग करता हूं, जैसा कि मैं समझता हूं कि समस्या, आपके समाधान के साथ Deeno यह है कि यदि उपयोगकर्ता को अमान्य डेटा पोस्ट करने के बाद पृष्ठ को रीफ्रेश करना था, तो उन्हें "क्या आप प्रपत्र डेटा को पुनः सबमिट करना चाहते हैं" पुष्टि प्राप्त करेंगे। TemMData समाधान का उपयोग कर के रूप में MattMitchell कहते हैं कि इस समस्या को समाप्त करता है।
user10479

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

2

यदि आप डेटा को पुनर्निर्देशित कार्रवाई के लिए पास करना चाहते हैं, तो आप जिस विधि का उपयोग कर सकते हैं वह है:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);

0

TempData वह समाधान है जो डेटा को क्रिया से क्रिया तक रखता है।

Employee employee = new Employee
                {
                        EmpID = "121",
                        EmpFirstName = "Imran",
                        EmpLastName = "Ghani"
                };
                TempData["Employee"] = employee;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.