如何在到达控制器之前改变动作(路线)

时间:2012-05-15 15:41:13

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

任何人都知道如何在Application_BeginRequest方法中更改路由/操作(只是操作,无需更改控制器),或者在到达控制器之前的任何其他方面

这是我目前的解决方案:

public class MyFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.ContentType == "application/x-amf")
        {
            //... some stuff
            filterContext.ActionParameters["target"] = body.Target;
            //...
            base.OnActionExecuting(filterContext);
        }
    }
}

我在目标中获得所有动作

 [MyFilter]
 public ActionResult(string target)
 {
      return RedirectToAction(target);
 }

1 个答案:

答案 0 :(得分:3)

想到两种方法CreateActionInvoker和HandleUnknownAction都可以做你正在寻找的东西,具体取决于你是如何以及为什么这样做的。

public class MyController
{
        protected override IActionInvoker CreateActionInvoker()
        {
            return base.CreateActionInvoker();
        }
        protected override void HandleUnknownAction(string actionName)
        {
            base.HandleUnknownAction(actionName);
        }
}

编辑添加动作调用者的示例

public class MyController : Controller
{
    protected override IActionInvoker CreateActionInvoker()
    {
        if (this.Request.ContentType == "application/x-amf")
        {
            return new XAMFActionInvoker();
        }
        return base.CreateActionInvoker();
    }

    public class XAMFActionInvoker : IActionInvoker
    {
        public bool InvokeAction(ControllerContext controllerContext, string actionName)
        {
            // find the action you want to invoke
            var method = controllerContext.Controller.GetType().GetMethod("xamfAction");
            var result = (ActionResult)method.Invoke(controllerContext.Controller,... your actionName parameters...);
            result.ExecuteResult(controllerContext);
        }
    }
}

编辑2 另一个选择,如果你想要覆盖多个动作,但控制器也在改变默认的ControllerFactory。在Application_Start中,将新控制器工厂设置为您为此场合构建的自定义。这是相当复杂的,所以我不推荐它,除非你需要很多控制。

 ControllerBuilder.Current.SetControllerFactory(IController factory)

编辑3 最后一个例子是不添加任何操作,只是覆盖HandleUnknownAction。这将允许您自定义将您的操作路由到您喜欢的任何方法。