2011-01-25 10 views
18

के अंदर रीडायरेक्ट मैं जानना चाहता हूं कि अगर मैं इसे करने की ज़रूरत है तो मैं नियंत्रक कन्स्ट्रक्टर के अंदर अनुरोध को पुनर्निर्देशित करने में सक्षम हूं?एमवीसी - कन्स्ट्रक्टर

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

मैं यह कैसे कर सकता हूं? धन्यवाद

संपादित करें # 1

शुरू में मैं प्रयोग किया है:

public override void OnActionExecuting(ActionExecutingContext filterContext) 

वहाँ मैं कुछ अन्य नियंत्रक/कार्रवाई/URL पर रीडायरेक्ट कर सकता है, लेकिन बाद में समय में, मैं बदलने के लिए की जरूरत है मेरी नियंत्रक, जहां मैं अपने कन्स्ट्रक्टर में एक वैरिएबल प्रारंभ करता हूं और उसके पास कुछ कोड है जो वास्तव में अनुरोध को पुनर्निर्देशित करने की आवश्यकता है: पी

मुझे इसकी भी आवश्यकता है क्योंकि OnActionExecuting के बाद निष्पादित होता है ई नियंत्रक कन्स्ट्रक्टर। और मेरे तर्क में, रीडायरेक्ट को वहां करने की आवश्यकता है।

उत्तर

45

नियंत्रक कन्स्ट्रक्टर के अंदर रीडायरेक्ट करना एक अच्छा अभ्यास नहीं है क्योंकि संदर्भ प्रारंभ नहीं किया जा सकता है। मानक अभ्यास एक कस्टम एक्शन विशेषता लिखना और OnActionExecuting विधि को ओवरराइड करना है और अंदर रीडायरेक्ट करना है। उदाहरण:

public class RedirectingActionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     if (someConditionIsMet) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "someOther", 
       action = "someAction" 
      })); 
     } 
    } 
} 

और उसके बाद उस नियंत्रक को सजाने के लिए जिसे आप इस विशेषता के साथ रीडायरेक्ट करना चाहते हैं। इस विशेषता के साथ रीडायरेक्ट कर रहे नियंत्रक को सजाने के लिए बेहद सावधान रहें या आप अंतहीन पाश में भागने जा रहे हैं।

तो तुम सकता है:

[RedirectingAction] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // This action is never going to execute if the 
     // redirecting condition is met 
     return View(); 
    } 
} 

public class SomeOtherController : Controller 
{ 
    public ActionResult SomeAction() 
    { 
     return View(); 
    } 
} 
+0

तुम मुझे यह करने के लिए हरा :)। – bastijn

+0

संकेत के लिए धन्यवाद, लेकिन यही वह है जो मैंने पहले उपयोग किया था। EDIT # 1 – Dryadwoods

+0

@emanyalpsid जांचें, फिर मुझे इसे इस तरह से रखें: आप नियंत्रक कन्स्ट्रक्टर के अंदर रीडायरेक्ट नहीं कर सकते क्योंकि संदर्भ अभी तक प्रारंभ नहीं हुआ है। आप इसे 'प्रारंभिक' विधि के अंदर कर सकते हैं लेकिन IMHO यदि आपको कभी ऐसा करने की आवश्यकता है तो आप कुछ गलत कर रहे हैं। –

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