it-swarm.com.de

So rufen Sie einen anderen Controller an Aktion Von einem Controller in Mvc

Ich muss eine Controller B-Aktion FileUploadMsgView von Controller A aufrufen und einen Parameter dafür übergeben.

 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();
    }
117
user2156088

Controller sind nur Klassen. Rufen Sie die Aktionsmethode wie jedes andere Klassenmitglied auf:

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

97
Tieson T.

Wie @mxmissile in den Kommentaren zur akzeptierten Antwort sagt, sollten Sie den Controller nicht neu starten, da ihm die für IoC eingerichteten Abhängigkeiten fehlen und die HttpContext nicht vorhanden ist.

Stattdessen sollten Sie eine Instanz Ihres Controllers wie folgt erhalten:

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

Ihr Beispiel sieht aus wie Pseudo-Code. Sie müssen zurückgeben das Ergebnis von RedirectToAction:

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

wie @DLeh sagt Verwenden Sie eher

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

Wenn Sie dem Controller jedoch einen Controller-Kontext zuweisen, ist dies besonders wichtig, wenn Sie auf das User-Objekt, das Server-Objekt oder die HttpContext im 'Kind'-Controller zugreifen müssen.

Ich habe eine Codezeile hinzugefügt:

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

sie können aber auch mit System.Web auch auf den aktuellen Kontext zugreifen, auf Server oder auf die frühen Objekte mit der Bezeichnung "Mapped" zugreifen 

NB: Ich habe die Framework-Version 4.6 (Mvc5) zum Ziel.

13
Nishanth Shaan

Lassen Sie den Resolver das automatisch tun.

In einem Controller:

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's answer ist korrekt und erklärt, wie eine Instanz eines anderen Controllers abgerufen wird, ohne dass Abhängigkeiten für IoC fehlen

Nun müssen wir die Methode jedoch von diesem anderen Controller aus aufrufen.
Die vollständige Antwort wäre:

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

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

Genau das war es, wonach ich gesucht hatte, als ich herausfand, dass RedirectToAction() komplexe Klassenobjekte nicht passieren würde. 

Als Beispiel möchte ich die IndexComparison-Methode im LifeCycleEffectsResults-Controller aufrufen und ein komplexes Klassenobjekt namens model übergeben.

Hier ist der Code, der fehlgeschlagen ist:

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

Erwähnenswert ist, dass Strings, Integer usw. die Fahrt zu dieser Controller-Methode überlebten, aber generische Listenobjekte litten an dem, was an C-Speicherlecks erinnerte.

Wie oben empfohlen, hier der Code, durch den ich ihn ersetzt habe:

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

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

Jetzt funktioniert alles wie geplant. Danke, dass Sie den Weg gegangen sind.

1
cghore

Wenn jemand nach einer Vorgehensweise im .net-Kern sucht, habe ich dies durch Hinzufügen des Controllers beim Start erreicht 

services.AddTransient<MyControllerIwantToInject>();

Dann injizieren Sie es in den anderen Controller 

public class controllerBeingInjectedInto : ControllerBase
{
    private readonly MyControllerIwantToInject _myControllerIwantToInject

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

Dann nennen Sie es einfach so _myControllerIwantToInject.MyMethodINeed();

0

wenn das problem ist anzurufen. Sie können es mit dieser Methode aufrufen. 

yourController obj= new yourController();

obj.yourAction();
0
user5407401