コントローラ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();
}
コントローラは単なるクラスです - 新しいクラスを作成し、他のクラスメンバと同じようにアクションメソッドを呼び出します。
var result = new ControllerB().FileUploadMsgView("some string");
@mxmissileが承認された回答へのコメントで述べているように、あなたはそれがIoCのために設定された依存関係を見逃して、HttpContext
を持たないのでコントローラを新しくしてはいけません。
代わりに、あなたはこのようなあなたのコントローラのインスタンスを得るべきです:
var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
あなたのサンプルは疑似コードのように見えます。 RedirectToAction
の結果をreturnする必要があります。
return RedirectToAction("B",
"FileUploadMsgView",
new { FileUploadMsg = "File uploaded successfully" });
@ DLehが言うように
var controller = DependencyResolver.Current.GetService<ControllerB>();
しかし、コントローラにコントローラのコンテキストを与えることは、特にUser
オブジェクト、Server
オブジェクト、または 'child'コントローラ内のHttpContext
にアクセスする必要がある場合に重要です。
コード行を追加しました:
controller.ControllerContext = new ControllerContext(Request.RequestContext, controller);
それ以外の場合は、System.Webを使用して現在のコンテキストにもアクセスし、Server
または前述のオブジェクトにアクセスすることもできます。
注意:私はフレームワークバージョン4.6(Mvc5)をターゲットにしています。
リゾルバに自動的にそれをさせてください。
Aコントローラー内部:
public class AController : ApiController
{
private readonly BController _bController;
public AController(
BController bController)
{
_bController = bController;
}
public httpMethod{
var result = _bController.OtherMethodBController(parameters);
....
}
}
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");
誰かが.netコアでこれを行う方法を見ているなら、私は起動時にコントローラを追加することによってそれを達成しました
services.AddTransient<MyControllerIwantToInject>();
それから他のコントローラーにそれを注入する
public class controllerBeingInjectedInto : ControllerBase
{
private readonly MyControllerIwantToInject _myControllerIwantToInject
public controllerBeingInjectedInto(MyControllerIwantToInject myControllerIwantToInject)
{
_myControllerIwantToInject = myControllerIwantToInject;
}
それならちょうど_myControllerIwantToInject.MyMethodINeed();
のようにそれを呼び出してください
問題が電話することであるならば。このメソッドを使って呼び出すことができます。
yourController obj= new yourController();
obj.yourAction();
これは、RedirectToAction()
が複雑なクラスオブジェクトを渡さないことを見つけた後に私が探していたものです。
例として、IndexComparison
コントローラのLifeCycleEffectsResults
メソッドを呼び出し、それにmodelという名前の複雑なクラスオブジェクトを渡します。
失敗したコードは次のとおりです。
return RedirectToAction("IndexComparison", "LifeCycleEffectsResults", model);
注目に値するのは、文字列、整数などがこのコントローラメソッドへの移行を乗り切って生き残ったことですが、ジェネリックリストオブジェクトはCメモリリークを思い出させるものに苦しんでいました。
上記で推奨されているように、これは私がそれを置き換えたコードです:
var controller = DependencyResolver.Current.GetService<LifeCycleEffectsResultsController>();
var result = controller.IndexComparison(model);
return result;
すべてが現在意図したとおりに機能しています。道をリードしてくれてありがとう。