web-dev-qa-db-ja.com

asp.net mvcアクションフィルターで指定されたコントローラーとアクションにリダイレクトする

私は、新しいセッションを検出し、これが発生したことを通知するページにユーザーをリダイレクトしようとするアクションフィルターを作成しました。唯一の問題は、アクションフィルターのコントローラー/アクションコンボにリダイレクトする方法がわからないことです。代わりに、指定されたURLにリダイレクトする方法しか把握できません。 mvc2のアクションフィルターでコントローラー/アクションコンボにリダイレクトする直接的な方法はありますか?

43
Nick Larsen

HttpContentへの参照を取得してActionFilterで直接リダイレクトするのではなく、フィルターコンテキストの結果をRedirectToRouteResultに設定できます。それはテストのために少しきれいで優れています。

このような:

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

    base.OnActionExecuting(filterContext);
}
90
Richard Garside

編集:元の質問は、セッションログアウトを検出し、指定されたコントローラーとアクションに自動的にリダイレクトする方法についてでした。質問は現在の形式であるため、はるかに有用であることが証明されました。


私はこの目標を達成するためにアイテムの組み合わせを使用することになりました。

最初に見つかったセッション有効期限フィルター here です。次に、何らかの方法でコントローラー/アクションのコンボを指定してリダイレクトURLを取得したかったのですが、多くの here の例が見つかりました。最終的に私はこれを思いついた:

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);
    }
}
17
Nick Larsen

呼び出し RedirectToAction using this overload

protected internal RedirectToRouteResult RedirectToAction(
    string actionName,
    RouteValueDictionary routeValues
)

アクションフィルターでは、ストーリーが少し異なります。良い例については、こちらをご覧ください:

http://www.dotnetspider.com/resources/29440-ASP-NET-MVC-Action-filters.aspx

5
Robert Harvey