Как перенаправить из OnActionExecuting в Base Controller?
Я попробовал два способа: Response.Redirect(), который ничего не делает, а также вызов нового метода внутри базового контроллера, который возвращает ActionResult и возвращает RedirectToAction()... ни одна из этих работ.
Как я могу сделать перенаправление из метода OnActionExecuting?
4 ответа
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
Это также можно сделать так:
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{"controller", "Home"},
{"action", "Index"}
}
);
Создать отдельный класс,
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();
}
}
Если перенаправленный контроллер наследует от того же 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" } });
}
}
}