Temel Denetleyicide OnActionExecuting'den nasıl yeniden yönlendirme yapılır?


185

Ben iki yol denedim: hiçbir şey yapmıyor Response.Redirect () yanı sıra bir ActionResult döndürür ve RedirectToAction () ... döndürmek var Base Controller içinde yeni bir yöntem çağırma.

OnActionExecuting yönteminden nasıl yönlendirme yapabilirim?

Yanıtlar:


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

79
Bunun yerine new RedirectResult(url)de kullanabilirsiniz new RedirectToAction(string action, string controller). Bu, yanıtınızı gönderdikten sonra MVC'ye eklenmiş olabilir. Çözümün beni yine de doğru yola soktu.
Manfred

3
@Pluc - OnActionExecuting ilk önce gerçekleşir. Context.Result öğesini ayarlarsanız, yönlendirme eylem yürütülmeden önce gerçekleşir. (Kişisel test / hata ayıklama ile doğrulanmıştır.)
James

39
@Manfred Not, atama yönteme yapılmalıdır (olmadan new) RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
cederlof

1
@Manfred Sadece RedirectToAction'ı yeni yapmayacağınızı eklemek istedim. Sadece filterContext.Result = RedirectToAction (..)
Sinaestetik

4
Geçerli bağlamda 'RedirectToAction' adı yok ??
Dan Hastings

56

Bu şekilde de yapılabilir:

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

35

Ayrı bir sınıf oluşturun,

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

Ardından, bir denetleyici oluşturduğunuzda, bu ek açıklamayı şu şekilde adlandırın:

[RedirectingAction]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Bu anonim nesneyiRouteValueDictionary MVC içinde başka bir yere yönlendirmeyi yansıtırken yapıcı için tercih ederim . +1
Gone Coding

3

Yeniden yönlendirilen denetleyici baseController, OnActionExecutingyöntemi geçersiz kıldığımız yerden devralırsa, özyinelemeli döngüye neden olur. Hesap denetleyicisinin giriş işlemine yönlendirdiğimizi varsayalım, giriş işlemi OnActionExecutingyöntemi çağırır ve aynı giriş işlemine tekrar tekrar yönlendirilir ... Bu nedenle OnActionExecuting, isteğin aynı denetleyiciden hava durumunu kontrol etmek için bir check-in yöntemi uygulamalıyız. bu yüzden giriş işlemini tekrar yönlendirmeyin. İşte kod:

korumalı geçersiz kılma.

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
deneyin {int CompanyId = UserContext.Company.CompanyId; } catch {if (filterContext.Controller.GetType ()! = typeof (AccountController)) {filterContext.Result = new RedirectToRouteResult (yeni RouteValueDictionary {{"denetleyici", "Hesap"}, {"eylem", "Giriş"}} ); }}
abdul hameed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.