Подтвердить что ты не робот

Перенаправление на указанный контроллер и действие в фильтр действий asp.net mvc

Я написал фильтр действий, который обнаруживает новый сеанс и пытается перенаправить пользователя на страницу, информируя их о том, что это произошло. Единственная проблема заключается в том, что я не могу понять, как перенаправить ее на контроллер/комбинацию действий в фильтр действий. Вместо этого я могу только выяснить, как перенаправить на указанный URL. Есть ли прямой способ перенаправления на контроллер/комбинацию действий в фильтр действий в mvc2?

4b9b3361

Ответ 1

Вместо того, чтобы получать ссылку на HttpContent и перенаправлять непосредственно в ActionFilter, вы можете установить, что результатом контекста фильтра является RedirectToRouteResult. Это немного чище и лучше для тестирования.

Вот так:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if(something)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary {{ "Controller", "YourController" },
                                      { "Action", "YourAction" } });
    }

    base.OnActionExecuting(filterContext);
}

Ответ 2

EDIT: Первоначальный вопрос состоял в том, как обнаружить выход из сеанса, а затем автоматически перенаправить на указанный контроллер и действие. Вопрос оказался гораздо более полезным, поскольку в настоящее время он имеет форму.


В итоге я использовал комбинацию элементов для достижения этой цели.

Сначала фильтр окончания сеанса найден здесь. Затем я хотел каким-то образом указать контроллер /action combo для получения URL-адреса переадресации, в котором я нашел множество примеров здесь. В итоге я придумал это:

public class SessionExpireFilterAttribute : ActionFilterAttribute
{
    public String RedirectController { get; set; }
    public String RedirectAction { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext ctx = HttpContext.Current;

        if (ctx.Session != null)
        {
            if (ctx.Session.IsNewSession)
            {
                string sessionCookie = ctx.Request.Headers["Cookie"];
                if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    UrlHelper helper = new UrlHelper(filterContext.RequestContext);
                    String url = helper.Action(this.RedirectAction, this.RedirectController);
                    ctx.Response.Redirect(url);
                }
            }
        }

        base.OnActionExecuting(filterContext);
    }
}