任何人都知道如何在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);
}
答案 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。这将允许您自定义将您的操作路由到您喜欢的任何方法。