2009-10-14 59 views
3

有没有办法从动作过滤器注入引用者动作? 假设我有一个来自动作X的视图。在视图视图中,我称作为动作Y,并且我想再次重定向到动作X.(有多个称为动作Y的X动作)。我认为如果我有一个参数调用referrerAction和一个用前面的动作填充它的动作过滤器可能会很好。可能吗?通过动作过滤器注入引用者动作?

谢谢。

回答

2

这里是我该怎么办:

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中有更多的自动行为 - 例如,它可以检查返回的结果是否是重定向,如果有值,则自动转到返回点。或者你可以用[ReturnPoint(Automatic = true)]来控制它,等等。

+0

他不应该用[ReturnPoint]属性标记Y动作吗? – 2009-10-14 12:05:25

+0

不,他想重定向回X,所以这就是返回点。例如,购物车是退货点,它会调用misc操作,但他们会想要返回到购物车 - 所以我们将购物车/索引标记为[ReturnPoint]。然后,Edit()将调用RedirectOrReturn()。 – queen3 2009-10-14 15:52:33