26

मैं यह सुनिश्चित करना चाहता हूं कि मेरे मामले में QueryString में एक विशेष पैरामीटर request_id पुनर्निर्देशित कार्रवाई के लिए प्रचारित है।RedirectToAction में QueryString पैरामीटर का प्रचार

,

[HttpPost] 
public ActionResult First() 
{ 
    //////////////////// 
    // Lots of code ... 
    //////////////////// 

    return RedirectToAction("Second"); 
} 

अब कहते हैं, उदाहरण के लिए, मैं एक कार्रवाई First है कहो First पोस्टबैक QueryString में एक पैरामीटर है, जो मैं Second कार्रवाई करने के लिए पारित करने के लिए चाहते हैं के लिए किया था। एक तरह से करने के लिए यह RedirectToAction कॉल अपने आप में मूल्य पारित करने के लिए हो सकता है,

string requestId = Request.QueryString[REQUEST_ID_KEY]; 
return RedirectToAction("Second", new { REQUEST_ID_KEY = requestId }); 

लेकिन मैं कार्रवाई की एक श्रृंखला में यह करने के लिए है और मैं कार्रवाई के अंदर अनुरोध आईडी प्रचार तर्क शामिल करने के लिए तैयार नहीं हूँ। यह बेहतर होगा अगर मैं इसे ActionFilter के अंदर शामिल कर सकता हूं, लेकिन मैं यह समझ नहीं सकता कि एक्शनफिल्टर से क्वेरीरीस्ट्रिंग में पैरामीटर कैसे जोड़ें। कोई विचार?

उत्तर

48
public class PreserveQueryStringAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var redirectResult = filterContext.Result as RedirectToRouteResult; 
     if (redirectResult == null) 
     { 
      return; 
     } 

     var query = filterContext.HttpContext.Request.QueryString; 
     // Remark: here you could decide if you want to propagate all 
     // query string values or a particular one. In my example I am 
     // propagating all query string values that are not already part of 
     // the route values 
     foreach (string key in query.Keys) 
     { 
      if (!redirectResult.RouteValues.ContainsKey(key)) 
      { 
       redirectResult.RouteValues.Add(key, query[key]); 
      } 
     } 
    } 
} 

और उसके बाद:

[HttpPost] 
[PreserveQueryString] 
public ActionResult First() 
{ 
    //////////////////// 
    // Lots of code ... 
    //////////////////// 

    return RedirectToAction("Second"); 
} 
+1

@ डारिन .. बस ज्ञान के लिए .. क्या मुझे पता चलेगा कि सत्र या टेम्पपडाटा पर इस कार्यान्वयन का क्या फायदा है? –

+2

@alok_dida, TempData दृश्यों के पीछे सत्र का उपयोग करता है। व्यक्तिगत रूप से मैं अपने अनुप्रयोगों में सत्र का कभी भी उपयोग नहीं करता हूं। मैं उन्हें एक स्टेटलेस और रीस्टफुल तरीके से डिजाइन करना पसंद करता हूं। इसलिए जब से मैं web.config ('') में सत्र अक्षम करता हूं, ठीक है, सत्र और TempData मेरे लिए लागू नहीं होता है। –

+0

@ डारिन .. ओक्स। एक और सवाल (मुझे आशा है कि आप मेरे प्रश्नों के समूह से परेशान नहीं होंगे), मैं एक आवेदन लागू कर रहा हूं जो फॉर्म प्रमाणीकरण का उपयोग करता है। मैं एप्लिकेशन के माध्यम से लॉग इन उपयोगकर्ता के "UserID" को रखना चाहता हूं। सत्र का उपयोग किए बिना मैं इस परिदृश्य को कैसे कार्यान्वित कर सकता हूं? मैं एमवीसी 3. –

0

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

+0

मैं पोस्टबैक में डेटा भी आवश्यकता होगी करने के लिए कैसे पर लिखा है .. तो मैं में इसे पारित करने के लिए है QueryString –

+0

आपको सत्र से डेटा आसानी से प्राप्त नहीं होगा जब तक कि आप सत्र से कुंजी को न हटाएं ताकि डेटा पोस्टबैक कार्रवाई में भी उपलब्ध हो। –

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