RedirectToAction
защищен, и мы можем использовать его только внутри действий. Но если я хочу перенаправить фильтр?
public class IsGuestAttribute: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Ctx.User.IsGuest)
filterContext.Result = (filterContext.Controller as Controller)
.RedirectToAction("Index", "Home");
}
}
Ответ 1
RedirectToAction
- это просто вспомогательный метод для построения RedirectToRouteResult()
, поэтому вы просто создаете новый RedirectToRouteResult()
, проходящий по RouteValueDictionary()
со значениями для вашего действия.
Заполните образец на основе кода от @Domenic в комментарии ниже:
public class IsGuestAttribute: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Ctx.User.IsGuest)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "controller", "Home" },
{ "action", "Index" }
});
}
}
}
Ответ 2
Вот пример кода:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Ctx.User.IsGuest)
{
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("action", "Index");
redirectTargetDictionary.Add("controller", "Home");
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
}
Ответ 3
Я знаю, что я немного опоздал на вечеринку, но я использовал решение veggerby и создал вспомогательный класс, который может быть полезен некоторым людям, поэтому я хотел бы предоставить его здесь:
public static class ActionFilterHelpers
{
public static void Redirect(this ActionExecutingContext filterContext, String controller, String action, object routeValues)
{
filterContext.Result = Redirect(controller, action, routeValues);
}
public static ActionResult Redirect(String controller, String action, object routeValues)
{
var routeValues = new RouteValueDictionary();
routeValues["controller"] = controller;
routeValues["action"] = action;
foreach (var keyValue in new ObjectDictionary(routeValues))
routeValues.Add(keyValue.Key, keyValue.Value);
return new RedirectToRouteResult(routeValues);
}
}
Я представил как статический метод, возвращающий перенаправление ActionResult
, так и метод расширения, который расширяет filterContext
. Надеюсь, что кто-то найдет это полезным.
ObjectDictionary
- это класс, который использует отражение для создания словаря из свойств объекта, из которого он построен. Я не включил этот код, потому что считаю, что есть лучший способ сделать это где-то в рамках. Я еще не нашел его, но я не хочу, чтобы другие наследовали мои потенциальные ошибки.
Ответ 4
Безопасность/авторизация/аутентификация Фильтры должны использовать AuthorizeAttribute и IAuthorizationFilter.
public class IsGuestAttribute: AuthorizeAttribute, IAuthorizationFilter
{
public void OnResultExecuted(ResultExecutedContext filterContext)
{
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!Ctx.User.IsGuest)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "controller", "Home" },
{ "action", "Index" }
});
}
}
}
Ответ 5
Использование: filterContext.RedirectToAction("Login", "Account");
Здесь класс-помощник, который я написал с некоторыми методами расширения, написанными для обеспечения функциональности RedirectToAction в большем количестве мест. Это слишком поздно для OP, но, надеюсь, это помогает кому-то!
public static class RedirectHelper
{
// RedirectToAction Extension Methods
public static void RedirectToAction(this HttpResponseBase response, String action, String controller, object routeValues = null, bool endResponse = false)
{
response.RedirectToRoute(CreateRoute(action, controller, routeValues));
if (endResponse) response.End();
}
public static void RedirectToAction(this HttpResponse response, String action, String controller, object routeValues = null, bool endResponse = false)
{
response.RedirectToRoute(CreateRoute(action, controller, routeValues));
if (endResponse) response.End();
}
public static void RedirectToAction(this ActionExecutingContext filterContext, String action, String controller, object routeValues = null, bool endResponse = false)
{
if (endResponse) filterContext.HttpContext.Response.RedirectToAction(action, controller, routeValues, true);
else filterContext.Result = new RedirectToRouteResult(CreateRoute(action, controller, routeValues));
}
public static void RedirectToAction(this ExceptionContext filterContext, String action, String controller, object routeValues = null, bool endResponse = false)
{
if (endResponse) filterContext.HttpContext.Response.RedirectToAction(action, controller, routeValues, true);
else {
filterContext.ExceptionHandled = true;
filterContext.Result = new RedirectToRouteResult(CreateRoute(action, controller, routeValues));
}
}
// Route Value Derivation
public static RouteValueDictionary CreateRoute(String action, String controller, object routeValues = null)
{
RouteValueDictionary result = routeValues != null ?
HtmlHelper.AnonymousObjectToHtmlAttributes(routeValues) :
new RouteValueDictionary();
result["controller"] = controller;
result["action"] = action;
return result;
}
}
Есть больше ControllerContexts, которые не включены, но довольно легко добавить свои собственные на основе ваших потребностей.