Я написал фильтр действий, который обнаруживает новый сеанс и пытается перенаправить пользователя на страницу, информируя их о том, что это произошло. Единственная проблема заключается в том, что я не могу понять, как перенаправить ее на контроллер/комбинацию действий в фильтр действий. Вместо этого я могу только выяснить, как перенаправить на указанный URL. Есть ли прямой способ перенаправления на контроллер/комбинацию действий в фильтр действий в mvc2?
Перенаправление на указанный контроллер и действие в фильтр действий asp.net mvc
Ответ 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);
}
}
Ответ 3
Вызвать RedirectToAction, используя эту перегрузку
protected internal RedirectToRouteResult RedirectToAction(
string actionName,
RouteValueDictionary routeValues
)
В Action Filters история немного отличается. Для хорошего примера см. Здесь:
http://www.dotnetspider.com/resources/29440-ASP-NET-MVC-Action-filters.aspx