Mvcでコントローラから別のコントローラのアクションを呼び出す方法

コントローラAからコントローラBのアクションFileUploadMsgViewを呼び出す必要があり、そのためのパラメータを渡す必要があります。

 Code---its not going to the controller B's FileUploadMsgView().
    In ControllerA
  private void Test()
    {

        try
        {//some codes here
            ViewBag.FileUploadMsg = "File uploaded successfully.";
            ViewBag.FileUploadFlag = "2";

            RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File   uploaded successfully" });
        }

     In ControllerB receiving part
  public ActionResult FileUploadMsgView(string FileUploadMsg)
    {
         return View();
    }
質問へのコメント (6)

受理された回答のコメントで@mxmissileが言っているように、IoCのために設定された依存関係が欠落し、HttpContextを持たないので、コントローラを新規作成するべきではありません'。

代わりに、次のようにコントローラのインスタンスを取得する必要があります:

var controller = DependencyResolver.Current.GetService();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
解説 (12)
ソリューション

コントローラは単なるクラスであり、他のクラスのメンバーと同じように、新しいものを作ってアクションメソッドを呼び出します:

var result = new ControllerB().FileUploadMsgView("some string");.

解説 (12)

あなたのサンプルは、偽のコードのように見えます。RedirectToAction`の結果を return する必要があります:

return RedirectToAction("B", 
                        "FileUploadMsgView",
                        new { FileUploadMsg = "File uploaded successfully" });
解説 (2)

@DLehが言うように。 むしろ使用してください。

var controller = DependencyResolver.Current.GetService();

ただし、コントローラーを指定する場合、特に「子」コントローラー内の「ユーザー」オブジェクト、「サーバー」オブジェクト、または「HttpContext」にアクセスする必要がある場合は、コントローラーコンテキストが重要です。

コードの行を追加しました。

controller.ControllerContext = new ControllerContext(Request.RequestContext, controller);

または、System.Webを使用して現在のコンテキストにアクセスしたり、「サーバー」または初期に調整されたオブジェクトにアクセスしたりすることもできます。

注意:フレームワークバージョン4.6(Mvc5)をターゲットにしています。

解説 (4)

リゾルバに自動的に実行させます。

コントローラーの内部:

public class AController : ApiController
{
    private readonly BController _bController;

    public AController(
    BController bController)
    {
        _bController = bController;
    }

    public httpMethod{
    var result =  _bController.OtherMethodBController(parameters);
    ....
    }

}
解説 (1)

誰かが.netコアでこれを行う方法を検討している場合、起動時にコントローラーを追加することでそれを達成しました。

services.AddTransient();

次に、それを他のコントローラーに注入します。

public class controllerBeingInjectedInto : ControllerBase
{
    private readonly MyControllerIwantToInject _myControllerIwantToInject

     public controllerBeingInjectedInto(MyControllerIwantToInject myControllerIwantToInject)
{
       _myControllerIwantToInject = myControllerIwantToInject;
      }

次に、そのように呼び出します _myControllerIwantToInject.MyMethodINEed();

解説 (0)

Dlehの答えは正解であり、IoCに設定された依存関係を見逃さずに別のコントローラーのインスタンスを取得する方法を説明します。

ただし、この他のコントローラーからメソッドを呼び出す必要があります。 完全な答えは:です。

var controller = DependencyResolver.Current.GetService();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);

//Call your method
ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall");
解説 (1)

これはまさに、「RedirectToAction()」が複雑なクラスオブジェクトを渡さないことを発見した後に探していたものです。

例として、「LifeCycleEffectsResults」コントローラーで「IndexComparison」メソッドを呼び出して、モデルという名前の複雑なクラスオブジェクトを渡します。

失敗したコードは次のとおりです。< br />。

return RedirectToAction("IndexComparison", "LifeCycleEffectsResults", model);

注目に値するのは、文字列、整数などがこのコントローラーメソッドへの旅を生き延びていたが、一般的なリストオブジェクトはCメモリのリークを連想させるものに悩まされていたことです。

上記で推奨したように、これを次のように置き換えたコードは次のとおりです。< br />。

var controller = DependencyResolver.Current.GetService();

var result = controller.IndexComparison(model);
return result;

現在、すべてが意図したとおりに機能しています。 先導していただきありがとうございます。

解説 (0)

問題が呼び出すことである場合。 この方法で呼び出すことができます。

yourController obj= new yourController();

obj.yourAction();
解説 (1)