1

任何人都知道如何在 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);
 }
4

1 回答 1

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。这将允许您自定义将您的操作路由到您喜欢的任何方法。

于 2012-05-15T16:18:17.517 回答