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 の 2 つのメソッドが頭に浮かびます。どちらも、実行方法と理由に応じて、探していることを実行できます。

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

EDIT 2 アクション以上のものをオーバーライドしようとしているが、コントローラーもデフォルトのControllerFactoryを変更している場合の別のオプション。Application_Start で、新しいコントローラー ファクトリを、この機会に作成したカスタムに設定します。ただし、これはかなり複雑なので、多くの制御が必要でない限りお勧めしません。

 ControllerBuilder.Current.SetControllerFactory(IController factory)

編集 3 最後の例は、アクションを追加せず、HandleUnknownAction をオーバーライドするだけです。これにより、アクションを好きな方法にカスタムルーティングできます。

于 2012-05-15T16:18:17.517 に答える