web-dev-qa-db-ja.com

他のコントローラーを呼び出す方法アクション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();
    }
129
user2156088

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

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

92
Tieson T.

@mxmissileが承認された回答へのコメントで述べているように、あなたはそれがIoCのために設定された依存関係を見逃して、HttpContextを持たないのでコントローラを新しくしてはいけません。

代わりに、あなたはこのようなあなたのコントローラのインスタンスを得るべきです:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
159
DLeh

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

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

@ DLehが言うように

var controller = DependencyResolver.Current.GetService<ControllerB>();

しかし、コントローラにコントローラのコンテキストを与えることは、特にUserオブジェクト、Serverオブジェクト、または 'child'コントローラ内のHttpContextにアクセスする必要がある場合に重要です。

コード行を追加しました:

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

それ以外の場合は、System.Webを使用して現在のコンテキストにもアクセスし、Serverまたは前述のオブジェクトにアクセスすることもできます。

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

13
Nishanth Shaan

リゾルバに自動的にそれをさせてください。

Aコントローラー内部:

public class AController : ApiController
{
    private readonly BController _bController;

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

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

}
6
David Castro

Dlehの答え は正しいので、IoCに設定された依存関係を失わずに別のコントローラのインスタンスを取得する方法を説明してください

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

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

//Call your method
ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall");
3
AlexB

誰かが.netコアでこれを行う方法を見ているなら、私は起動時にコントローラを追加することによってそれを達成しました

services.AddTransient<MyControllerIwantToInject>();

それから他のコントローラーにそれを注入する

public class controllerBeingInjectedInto : ControllerBase
{
    private readonly MyControllerIwantToInject _myControllerIwantToInject

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

それならちょうど_myControllerIwantToInject.MyMethodINeed();のようにそれを呼び出してください

1

問題が電話することであるならば。このメソッドを使って呼び出すことができます。

yourController obj= new yourController();

obj.yourAction();
1
user5407401

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

例として、IndexComparisonコントローラのLifeCycleEffectsResultsメソッドを呼び出し、それにmodelという名前の複雑なクラスオブジェクトを渡します。

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

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

注目に値するのは、文字列、整数などがこのコントローラメソッドへの移行を乗り切って生き残ったことですが、ジェネリックリストオブジェクトはCメモリリークを思い出させるものに苦しんでいました。

上記で推奨されているように、これは私がそれを置き換えたコードです:

var controller = DependencyResolver.Current.GetService<LifeCycleEffectsResultsController>();

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

すべてが現在意図したとおりに機能しています。道をリードしてくれてありがとう。

1
cghore