Внедрить действие реферера через фильтр действий?

Есть ли способ внедрить действие реферера из фильтра действий? Допустим, у меня есть представление, которое исходит от действия X. В представлении штампа я вызываю действие Y и хочу снова перенаправить на действие X. (Есть несколько действий X, которые вызывают действие Y). Я подумал, что было бы неплохо, если бы у меня был вызов параметра referrerAction и фильтр действия, заполняющий его предыдущим действием. Является ли это возможным?

Спасибо.


person Carles Company    schedule 14.10.2009    source источник


Ответы (1)


Вот как я это делаю:

  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);
      }
   }

Теперь вы отмечаете свои действия X с помощью [ReturnPoint] и вызываете RedirectOrReturn(), если хотите вернуться назад.

Я не использую UrlReferrer, потому что он может быть неправильным, и я не могу контролировать его значение. С ReturnPoint вы также можете иметь группы, например. [ReturnPoint("Заказы")] и RedirectOrReturn("Заказы").

Конечно, вы можете иметь более автоматическое поведение в OnActionExecuted - например. он может проверить, является ли возвращаемый результат Redirect, и автоматически перейти к ReturnPoint, если он имеет значение. Или вы можете управлять этим с помощью [ReturnPoint(Automatic=true)] и так далее.

person queen3    schedule 14.10.2009
comment
Нет, он хочет перенаправить обратно на X, так что это точка возврата. Например, корзина — это точка возврата, она будет вызывать разные действия, но они захотят вернуться обратно в корзину — поэтому мы помечаем корзину/индекс как [ReturnPoint]. Затем Edit() вызовет RedirectOrReturn(). - person queen3; 14.10.2009