आधार नियंत्रक में OnActionExecuting से पुनर्निर्देशित कैसे करें?


184

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

मैं OnActionExecuting विधि से पुनर्निर्देशित कैसे कर सकता हूं?

जवाबों:


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

79
इसकी जगह new RedirectResult(url)आप भी इस्तेमाल कर सकते हैं new RedirectToAction(string action, string controller)। आपके द्वारा अपना उत्तर पोस्ट करने के बाद इसे MVC में जोड़ा जा सकता है। आपके समाधान ने मुझे वैसे भी सही रास्ते पर ला खड़ा किया।
मैनफ्रेड

3
@Pluc - OnActionExecuting पहले होता है। यदि आप संदर्भ सेट करते हैं। परिणाम, तो एक्शन निष्पादित होने से पहले रीडायरेक्ट होता है। (व्यक्तिगत परीक्षण / डिबगिंग द्वारा सत्यापित।)
जेम्स

39
newfilterContext.Result = RedirectToAction(string action, string controller);
@ मेनफ्रेड

1
@ मैनफ्रेड मैं सिर्फ यह जोड़ना चाहता था कि आप RedirectToAction को नया नहीं करेंगे। यह सिर्फ filterContext.Result = RedirectToAction (..)
Sinaesthetic

4
वर्तमान संदर्भ में 'RedirectToAction' नाम मौजूद नहीं है ??
दान हेस्टिंग्स

56

इसे इस तरह भी किया जा सकता है:

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

35

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

    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();
    }
}

मैं निर्माता के लिएRouteValueDictionary इस अनाम वस्तु को पसंद करता हूं क्योंकि यह एमवीसी में कहीं और रूटिंग को दिखाता है। +1
'कोडिंग

3

यदि पुनर्निर्देशित नियंत्रक उसी से विरासत में मिला है 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" } });
      }
   }
}

1
try {int CompanyId = UserContext.Company.CompanyId; } catch {if (filterContext.Controller.GetType) (! = typeof (AccountController)) {filterContext.Result = new RedirectToRouteResult (नया रूटवेटवर्क) {{"कंट्रोलर", "" एक्शन "," लॉगिन "}} ); }}
अब्दुल हमीद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.