Вот улучшенная версия ответа @stusherwin с поддержкой ValidateAntiForgeryToken и MVC областей .
Вероятно, ваши действия POST имеют атрибут ValidateAntiForgeryToken для предотвращения CSRF-атак. В этом случае фильтр ValidateAntiForgeryToken всегда будет выполняться первым, поскольку это Фильтр авторизации. Поэтому нам нужно сделать HttpPostOrRedirectAttribute авторизационным фильтром. В противном случае будет сгенерировано исключение, что маркер защиты от подделки не найден.
Еще одним улучшением является добавление перенаправлений в области MVC
public class HttpPostOrRedirectAttribute : FilterAttribute, IAuthorizationFilter
{
public string RedirectAction { get; set; }
public string RedirectController { get; set; }
public string RedirectArea { get; set; }
public string[] ParametersToPassWithRedirect { get; set; }
public HttpPostOrRedirectAttribute(string redirectAction)
: this(redirectAction, null, new string[] { })
{
}
public HttpPostOrRedirectAttribute(string redirectAction, string[] parametersToPassWithRedirect)
: this(redirectAction, null, parametersToPassWithRedirect)
{
}
public HttpPostOrRedirectAttribute(string redirectAction, string redirectController, string[] parametersToPassWithRedirect)
{
RedirectAction = redirectAction;
RedirectController = redirectController;
ParametersToPassWithRedirect = parametersToPassWithRedirect;
}
public HttpPostOrRedirectAttribute(string redirectAction, string redirectController, string redirectArea)
{
RedirectAction = redirectAction;
RedirectController = redirectController;
RedirectArea = redirectArea;
}
public HttpPostOrRedirectAttribute(string redirectAction, string redirectController, string redirectArea, string[] parametersToPassWithRedirect)
{
RedirectAction = redirectAction;
RedirectController = redirectController;
RedirectArea = redirectArea;
ParametersToPassWithRedirect = parametersToPassWithRedirect;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.HttpMethod == "POST")
return;
string redirectUrl = GetRedirectUrl(filterContext.RequestContext);
filterContext.Controller.TempData["Warning"] = "Your action could not be completed as your"
+ " session had expired. Please try again.";
filterContext.Result = new RedirectResult(redirectUrl);
}
public string GetRedirectUrl(RequestContext context)
{
RouteValueDictionary routeValues = new RouteValueDictionary();
foreach (string parameter in ParametersToPassWithRedirect)
{
if (context.RouteData.Values.ContainsKey(parameter))
routeValues.Add(parameter, context.RouteData.Values[parameter]);
}
if (RedirectArea.IsNotEmpty())
routeValues.Add("area", RedirectArea);
string controller = RedirectController
?? context.RouteData.Values["controller"].ToString();
UrlHelper urlHelper = new UrlHelper(context);
return urlHelper.Action(RedirectAction, controller, routeValues);
}
}
Вот пример того, как использовать его вместе с атрибутом ValidateAntiForgeryToken и перенаправить в область администратора:
[HttpPostOrRedirect("Display", "User", "Admin", new[] { "id", "param1"}, Order = 0)]
[ValidateAntiForgeryToken(Order = 1)]
public ActionResult Delete(User user, int param1, string param2)
{
...
}