2010-07-09 8 views
159

मैंने दो तरीकों की कोशिश की है: Response.Redirect() जो कुछ भी नहीं करता है, साथ ही बेस कंट्रोलर के अंदर एक नई विधि को कॉल करता है जो एक एक्शन रिसेट देता है और इसे रीडायरेक्ट टॉक्शन() ... इन कार्यों में से कोई भी नहीं देता है।बेस नियंत्रक में OnActionExecuting से रीडायरेक्ट कैसे करें?

मैं OnActionExecuting विधि से रीडायरेक्ट कैसे कर सकता हूं?

उत्तर

310
public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ... 
    if (needToRedirect) 
    { 
     ... 
     filterContext.Result = new RedirectResult(url); 
     return; 
    } 
    ... 
} 
+71

' आप भी नए RedirectToAction (स्ट्रिंग कार्रवाई, स्ट्रिंग नियंत्रक) 'का उपयोग' सकता है। आपके उत्तर पोस्ट करने के बाद यह एमवीसी में जोड़ा जा सकता है। आपका समाधान मुझे वैसे भी सही रास्ते पर डाल दिया। – Manfred

+3

+1000 धन्यवाद! – IamStalker

+0

यह निष्पादित नहीं करेगा कि आपके वर्तमान कार्य में क्या है? क्या यह सुरक्षा दोष नहीं होगा? आइए मान लें कि एक ऐसी क्रिया है जो उपयोगकर्ता द्वारा/व्यवस्थापक/हटाएं/4 द्वारा रूट की गई है। यदि आपकी हालत जांचना है तो आप एक व्यवस्थापक हैं, और अगर नहीं तो पुनर्निर्देशित करें। उपयोगकर्ता 4 हटा दिया जाएगा, भले ही आप रीडायरेक्ट समाप्त हो जाएं, सही? – Pluc

49

यह इस तरह के रूप में अच्छी तरह से किया जा सकता है:

filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
        {{"controller", "Home"}, {"action", "Index"}}); 
29

एक अलग वर्ग बनाने,

public class RedirectingAction : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext context) 
     { 
     base.OnActionExecuting(context); 

     if (CheckUrCondition) 
     { 
      context.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "Home", 
       action = "Index" 
      })); 
     } 
     } 
    } 

फिर, जब आप एक नियंत्रक बनाने के लिए,

के रूप में यह व्याख्या फोन
[RedirectingAction] 
public class TestController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

मैं 'रूटवेल्यू डिक्शनरी' * कन्स्ट्रक्टर के लिए यह * अज्ञात ऑब्जेक्ट पसंद करता हूं क्योंकि यह एमवीसी में कहीं और रूटिंग को प्रतिबिंबित करता है। +1 –

+0

यह शानदार है! धन्यवाद – Johny

2

I f पुनर्निर्देशित नियंत्रक उसी baseController से प्राप्त होता है जहां हम OnActionExecuting विधि कारण रिकर्सिव लूप को ओवरराइड करते हैं। मान लीजिए कि हम इसे खाता नियंत्रक की लॉगिन कार्रवाई के लिए रीडायरेक्ट करते हैं, तो लॉगिन कार्रवाई OnActionExecuting विधि को कॉल करेगी और उसी लॉगिन कार्रवाई को बार-बार पर रीडायरेक्ट कर दी जाएगी ... इसलिए हमें मौसम जांचने के लिए OnActionExecuting विधि में चेक लागू करना चाहिए, अनुरोध अनुरोध से है यदि एक ही नियंत्रक है तो इसे फिर से लॉगिन कार्रवाई को रीडायरेक्ट न करें। यहां कोड है:

संरक्षित ओवरराइड।

void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    try 
    { 
     some condition ... 
    } 
    catch 
    { 
     if (filterContext.Controller.GetType() !=  typeof(AccountController)) 
     { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } }); 
     } 
    } 
} 
`नई RedirectResult (यूआरएल) के बजाय
+1

{ int companyId = UserContext.Company.CompanyId; } पकड़ { अगर (filterContext.Controller.GetType()! = Typeof (AccountController)) { filterContext.Result = नए RedirectToRouteResult ( नई RouteValueDictionary {{ "नियंत्रक", "खाता"}, { "कार्रवाई ", "लॉग इन करें" } }); } } –

+0

अच्छा पकड़ abdul, धन्यवाद – HolloW

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