Here is how I do it:
public class ReturnPointAttribute : Attribute
{
}
public class BaseController: Controller
{
private string returnPointUrl = null;
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
if (filterContext.ActionDescriptor.IsDefined(typeof(ReturnPointAttribute), true))
returnPointUrl = filterContext.HttpContext.Request.Url.ToString();
}
public ActionResult RedirectOrReturn<T>(Expression<Action<T>> action) where T : BaseController
{
return returnPointUrl.IsNullOrEmpty()
? MyControllerExtensions.RedirectToAction(this, action)
: (ActionResult)Redirect(returnPointUrl);
}
}
Now you mark X's actions with [ReturnPoint] and call RedirectOrReturn () if you want to go back.
UrlReferrer, , . ReturnPoint , . [ReturnPoint ( "" )] RedirectOrReturn ( "" ).
, OnActionExecuted - , , Redirect, ReturnPoint, . [ReturnPoint (Automatic = true)] ..