2010-01-13 20 views
21

में बाल क्रियाओं में रीडायरेक्ट परिणामों की अनुमति क्यों नहीं है मेरे पास कुछ आंशिक क्रियाएं हैं जिन्हें मैं Asp.Net Futures RenderAction विधि के साथ प्रस्तुत करता हूं। इनमें से कुछ प्रपत्रों को संसाधित करने के बाद रीडायरेक्ट करते हैं।Asp.net एमवीसी 2

अब जब मैं एएसपी.नेट एमवीसी 2 आरसी में अपग्रेड किया गया तो यह मुझे एक त्रुटि देता है "बाल क्रियाओं को रीडायरेक्ट क्रियाएं करने की अनुमति नहीं है"।

मैंने स्रोत कोड की जांच की और मुझे वह पंक्ति मिली जो अपवाद फेंकता है। इसके चारों ओर जाने के लिए मैं एक कस्टम रीडायरेक्ट रीसेट कर सकता हूं, लेकिन इससे पहले कि मैं समझूं कि फ्रेमवर्क इसे पहले स्थान पर क्यों अनुमति नहीं देता है। एक अच्छा कारण होना चाहिए और शायद मुझे ऐसा नहीं करना चाहिए।

कोई भी इस सीमा के कारण को जानता है?

धन्यवाद

उत्तर

32

सीमा मौजूद है क्योंकि MVC पहले से ही ग्राहक के लिए एक दृश्य प्रतिपादन शुरू कर दिया है। इस बिंदु से पुनर्निर्देशित करने का प्रभाव अपरिभाषित है। यह पूरी तरह से काम कर सकता है, यह रीडायरेक्ट किए बिना मूल दृश्य को प्रस्तुत करना जारी रख सकता है, यह एक अलग अपवाद फेंक सकता है, आदि

इस क्रिया को निष्पादित करने के परिणाम के बाद से, फ्रेमवर्क इसे अवरुद्ध करता है। अभ्यास में, समान कारणों से किसी भी दृश्य (या दृश्य जैसी सामग्री) के अलावा किसी अन्य चीज़ को प्रस्तुत करने के लिए रेंडरएक्शन का उपयोग कभी नहीं किया जाना चाहिए।

आपके विशेष मामले में, बाहरी कार्रवाई को पुनर्निर्देशित करना चाहिए। यदि आप उपयोगकर्ता के लिए कुछ भी दिखाए बिना दृश्य के भीतर से रीडायरेक्ट करना समाप्त कर रहे हैं, तो पहले स्थान पर देखने के लिए वास्तव में कोई उद्देश्य नहीं था, क्योंकि बाहरी कार्रवाई ने उचित रूप से काम को सौंप दिया होगा खुद।

1

उस स्थिति में केवल आंशिक दृश्य फ़ॉर्म को कार्रवाई करने के लिए यूआरएल सबमिट करें जो आपके समस्याग्रस्त पुनर्निर्देशन का लक्ष्य था और इसे अपने जीईटी संस्करण में खुद को पुनर्निर्देशन करने दें।

6

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

+0

एक ही परिदृश्य मेरे पास है यही कारण है कि:

समस्या को हल करने के लिए, मैं प्राधिकरण सभी बच्चे कार्यों पर पुनर्निर्देशन जाँच हटा दिया। चूंकि मैं केवल विस्तार के लिए व्यवस्थापक पृष्ठों पर इसका उपयोग कर रहा हूं, इसलिए मैंने रीडायरेक्ट को बाल क्रिया नियंत्रक में रखने का निर्णय लिया है। मैंने अपना खुद का ChildActionRedirectResult लिखा और फिर एक चाइल्डएक्शन कंट्रोलर बेस बनाया जो मेरे स्वयं के परिणाम का उपयोग करने के लिए रीडायरेक्ट विधियों को ओवरराइड करता है। मैं इसे अंतिम अंत उपयोग के लिए नहीं करूँगा। – Sruly

+0

मैं बस "आपके परिवर्तन सहेजे गए" संदेश और एक्सटेंशन प्रबंधित करने के लिए व्यवस्थापक पृष्ठ पर एक लिंक के साथ एक साधारण दृश्य परिणाम लौट आया। यह सुंदर नहीं है, लेकिन यह चाल है। –

3

कभी-कभी यह त्रुटि तब होती है जब आप बेस एक्शन परिणाम की कार्रवाई करने का प्रयास करते हैं। उदाहरण:

ActionResult X 
    Return View 
View X 
    RenderAction Y 

ActionResult Y 
    // Bla bla 
     return View 
    // else 
     return RedirectToAction X 
12

मेरा समाधान।

कार्रवाई विधि:

return View("Redirect", model); 

देखें: बाल कार्रवाई में कुछ इस तरह का उपयोग करने के

<script type="text/javascript" language="javascript"> 
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script> 
17

प्रयास करें:

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString()); 
+1

मैंने मुख्य पृष्ठ के आंशिक दृश्य के रूप में प्रदर्शित एक लॉगिन कार्रवाई में इसका उपयोग किया जिसे सफल लॉगिन – user1760527

+0

पर रीडायरेक्ट करने की आवश्यकता है, यह वास्तव में क्लाइंट ब्राउज़र को रीडायरेक्ट हेडर प्राप्त करने के बाद पृष्ठ का पुनः अनुरोध करने का कारण बनता है, लेकिन यह काफी अच्छी तरह से काम करता है। –

5

मेरी असामान्य मामले में, मुझे एक कस्टम AuthorizeAttribute था मेरे नियंत्रकों से जुड़ा हुआ जो कि एक बच्चे की कार्रवाई पर पुनर्निर्देशित करने का प्रयास कर रहा था, जो (ऊपर वर्णित है) बिल्कुल नहीं विवाह कर लिया।

Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) 
    //Child actions cannot redirect anyway, so no need to check permissions. 
    If filterContext.IsChildAction Then Exit Sub 

    .. parent authorisation checks .. 
संबंधित मुद्दे