POST क्रिया का उपयोग करके आप किसी पृष्ठ पर कैसे अनुप्रेषित करते हैं?


131

जब आप RedirectToActionकिसी नियंत्रक के भीतर कॉल करते हैं , तो यह स्वचालित रूप से एक HTTP जीईटी का उपयोग करके पुनर्निर्देशित करता है। मैं इसे स्पष्ट रूप से HTTP POST का उपयोग करने के लिए कैसे कहूं?

मेरे पास एक कार्रवाई है जो GET और POST दोनों अनुरोधों को स्वीकार करती है, और मैं RedirectToActionPOST का उपयोग करने और इसे कुछ मान भेजने में सक्षम होना चाहता हूं ।

ऐशे ही:

this.RedirectToAction(
    "actionname",
    new RouteValueDictionary(new { someValue = 2, anotherValue = "text" })
);

मैं चाहता हूँ someValueऔर anotherValueमूल्यों किसी GET के बजाय एक HTTP POST का उपयोग कर भेजा जाना है। क्या किसी को भी यह करना आता है?


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

जवाबों:


103

HTTP POST का उपयोग करते हुए किसी पृष्ठ पर पुनर्निर्देशन का समर्थन नहीं करता है। जब आप कहीं पर पुनर्निर्देशित करते हैं, तो HTTP "स्थान" शीर्षक ब्राउज़र को बताता है कि कहाँ जाना है, और ब्राउज़र उस पृष्ठ के लिए एक GET अनुरोध करता है। आपको शायद GET अनुरोधों के साथ-साथ POST अनुरोधों को स्वीकार करने के लिए अपने पृष्ठ के लिए कोड लिखना होगा।


4
जिज्ञासु ने मेरा उत्तर क्यों स्वीकार नहीं किया, मुझे लगता है कि मेरी लफ्फाजी ध्वनि है। :) फिर, मैं इसके बारे में थोड़ा पक्षपाती हो सकता हूं ...
जेसन बंटिंग

14
जबकि यह उत्तर मूल रूप से सही है, यह पूर्ण नहीं है। बहुत बेहतर वर्कअराउंड के लिए नीचे जेसन बंटिंग जवाब देखें।
एड्रियन ग्रिगोर 13

160

आपके विशेष उदाहरण के लिए, मैं बस यही करूँगा, क्योंकि आप स्पष्ट रूप से इस बात की परवाह नहीं करते हैं कि ब्राउज़र को वैसे भी पुनर्निर्देशित किया जा सकता है (आपके द्वारा पहले ही स्वीकार किए गए उत्तर को स्वीकार करने के आधार पर):

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index() {
   // obviously these values might come from somewhere non-trivial
   return Index(2, "text");
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int someValue, string anotherValue) {
   // would probably do something non-trivial here with the param values
   return View();
}

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

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

उम्मीद है की वो मदद करदे।


7
कौन जानता है कि आपको क्यों अपमानित किया गया। यह एक बहुत ही उपयोगी विधि है।
पीटर जे

2
इस तरह मैंने हमेशा इस समस्या को हल किया। इसको नीचा दिखाने का कोई मतलब नहीं है।
एड्रियन ग्रिगोर

39
मैंने मतदान किया, हालाँकि मैं लोगों को बेवकूफ कहने से असहमत हूँ जब आप उन्हें नहीं जानते।
जिम शूबर्ट

3
मैं एक नीच नहीं हूँ, लेकिन इसके साथ एक सावधानी यह है कि यदि आप एक अलग नाम के साथ एक दृश्य को कॉल करने के लिए थे, या यदि पैरामीटर महत्वपूर्ण हैं, तो वे खो गए हैं। कारण यह है कि URL सर्वर साइड पुनर्निर्देशित होने से पहले कार्रवाई + मापदंडों को प्रतिबिंबित करेगा। यह उपयोगकर्ता द्वारा भ्रम की स्थिति पैदा कर सकता है, खासकर यदि वे पृष्ठ को ताज़ा करते हैं और फिर खुद को पिछले पृष्ठ पर पाते हैं (क्योंकि ताज़ा पुराने URL का उपयोग किया गया है)। यह तकनीक अनिवार्य रूप से asp.net के Server.Transfer के समान है, और समान सावधानी बरती जानी चाहिए।
एरोनल्स

15
मैं प्रति sevote नहीं था, लेकिन मैं कारण देख सकते हैं। यह विधि MVC पैटर्न द्वारा स्थापित कोडिंग कन्वेंशन का उल्लंघन करती है। यह केवल उसी क्रिया को कॉल करने पर काम करता है। यदि कार्रवाई एक और है, तो एक ही नियंत्रक पर भी, रूटिंग मान खराब कर दिए जाते हैं और गलत दृश्य वापस कर दिया जाएगा। संक्षेप में: यह मत करो।
erlando

21

यदि आप क्वेरी स्ट्रिंग में कोई डेटा शामिल किए बिना रीडायरेक्ट के दौरान दो क्रियाओं के बीच डेटा पास करना चाहते हैं, तो मॉडल को TempData ऑब्जेक्ट में डालें।

कार्रवाई

TempData["datacontainer"] = modelData;

राय

var modelData= TempData["datacontainer"] as ModelDataType; 

TempData का अर्थ बहुत कम समय तक रहने वाला उदाहरण है, और आपको इसे केवल वर्तमान और बाद के अनुरोधों के दौरान ही उपयोग करना चाहिए! चूंकि टेंपडाटा इस तरह से काम करता है, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि अगला अनुरोध क्या होगा, और किसी अन्य दृश्य पर पुनर्निर्देशित करना एकमात्र समय है जब आप इसकी गारंटी दे सकते हैं।

इसलिए, एकमात्र परिदृश्य जहां TempData का उपयोग करना मज़बूती से काम करेगा जब आप पुनर्निर्देशित कर रहे हैं।


11

इसको आजमाओ

return Content("<form action='actionname' id='frmTest' method='post'><input type='hidden' name='someValue' value='" + someValue + "' /><input type='hidden' name='anotherValue' value='" + anotherValue + "' /></form><script>document.getElementById('frmTest').submit();</script>");

2
यह नफरत है, लेकिन इसे प्यार करता हूँ :)
दिव्य

इस तरह की हैक लेकिन यह एकमात्र तरीका था जो मैं कर सकता था जो मैं DRY का उल्लंघन किए बिना या अपने पूरे सेटअप को रिवाइव करना चाहता था! धन्यवाद!
jamheadart

6

मैं जेसन बंटिंग के उत्तर का विस्तार करना चाहूंगा

इस तरह

ActionResult action = new SampelController().Index(2, "text");
return action;

और एली को जेनेरिक वैरिएबल बनाने के बारे में कुछ विचार के लिए यहां दिया जाएगा

सभी प्रकार के नियंत्रक प्राप्त कर सकते हैं


आपको किसी नियंत्रक के साथ एक उदाहरण नहीं बनाना चाहिए new ...()क्योंकि आप हार जाएंगे RequestContext- यदि आप पहले से ही उसी नियंत्रक में हैं, तो आपको एक नया उदाहरण बनाने की आवश्यकता नहीं हो सकती है। अन्यथा, निम्न तरीके से लें: SampelController sampleController = DependencyResolver.Current.GetService<SampelController>()फिर: sampleController.ControllerContext = new ControllerContext(Request.RequestContext, sampleController);फिर आप return sampleController.Index(2, "text");बस एक संकेत कर सकते हैं :)
Matthias बर्गर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.