Mvc의 컨트롤러에서 다른 컨트롤러를 호출하는 방법 void Test()

컨트롤러 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 RedirectToAction("B",
                        "FileUploadMsgView",
                        new { FileUploadMsg = "File uploaded successfully" });

답변

@DLeh는 오히려 사용이라고 말합니다.

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

그러나 컨트롤러에 컨트롤러를 제공하는 것은 특히 User개체, Server개체 또는 HttpContext‘자식’컨트롤러 내부 에 액세스해야 할 때 중요 합니다 .

코드 줄을 추가했습니다.

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

그렇지 않으면 System.Web을 사용하여 현재 컨텍스트에 액세스 Server하거나 초기 객체에 액세스 할 수 있습니다

NB : 프레임 워크 버전 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);
    ....
    }

}

답변

누구나 .net 코어 에서이 작업을 수행하는 방법을 찾고 있다면 시작시 컨트롤러를 추가하여 달성했습니다.

services.AddTransient<MyControllerIwantToInject>();

그런 다음 다른 컨트롤러에 주입

public class controllerBeingInjectedInto : ControllerBase
{
    private readonly MyControllerIwantToInject _myControllerIwantToInject

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

그럼 그냥 그렇게 불러 _myControllerIwantToInject.MyMethodINeed();


답변

이것은 RedirectToAction()복잡한 클래스 객체를 전달하지 않는 것을 찾은 후에 정확히 찾고있는 것입니다.

예를 들어, 컨트롤러 에서 IndexComparison메소드 를 호출하고 LifeCycleEffectsResultsmodel이라는 복잡한 클래스 객체를 전달 하고 싶습니다 .

실패한 코드는 다음과 같습니다.

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

주목할만한 점은 문자열, 정수 등 이이 컨트롤러 방법으로의 여행에서 살아남 았지만 일반 목록 객체는 C 메모리 누수를 연상시키는 것으로 고통 받고 있다는 것입니다.

위에서 권장 한대로 다음 코드로 교체했습니다.

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

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

모든 것이 지금 의도 한대로 작동하고 있습니다. 길을 이끌어 주셔서 감사합니다.