wake-up-neo.net

Daten zwischen verschiedenen Controller-Aktionsmethoden übertragen

Ich benutze ASP.NET MVC 4. Ich versuche, Daten von einem Controller an einen anderen Controller zu übergeben. Ich verstehe das nicht richtig. Ich bin mir nicht sicher, ob das möglich ist?

Hier ist meine Quellaktionsmethode, von der ich die Daten übergeben möchte:

public class ServerController : Controller
{
     [HttpPost]
     public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)
     {
          XDocument updatedResultsDocument = myService.UpdateApplicationPools();

          // Redirect to ApplicationPool controller and pass
          // updatedResultsDocument to be used in UpdateConfirmation action method
     }
}

Ich muss es an diese Aktionsmethode in diesem Controller übergeben:

public class ApplicationPoolController : Controller
{
     public ActionResult UpdateConfirmation(XDocument xDocument)
     {
          // Will add implementation code

          return View();
     }
}

Ich habe Folgendes in der Aktionsmethode ApplicationPoolsUpdate versucht, aber es funktioniert nicht:

return RedirectToAction("UpdateConfirmation", "ApplicationPool", new { xDocument = updatedResultsDocument });

return RedirectToAction("UpdateConfirmation", new { controller = "ApplicationPool", xDocument = updatedResultsDocument });

Wie würde ich das erreichen?

69
Brendan Vogt

HTTP und Weiterleitungen

Lassen Sie uns zunächst noch einmal zusammenfassen, wie ASP.NET MVC funktioniert:

  1. Wenn eine HTTP-Anforderung eingeht, wird sie mit einer Reihe von Routen abgeglichen. Wenn eine Route mit der Anforderung übereinstimmt, wird die der Route entsprechende Controller-Aktion aufgerufen.
  2. Vor dem Aufrufen der Aktionsmethode führt ASP.NET MVC die Modellbindung durch. Bei der Modellbindung wird der Inhalt der HTTP-Anforderung, bei der es sich im Grunde nur um Text handelt, den stark typisierten Argumenten Ihrer Aktionsmethode zugeordnet

Erinnern wir uns auch daran, was eine Weiterleitung ist:

Eine HTTP-Umleitung ist eine Antwort, die der Webserver an den Client senden kann und die den Client auffordert, unter einer anderen URL nach dem angeforderten Inhalt zu suchen. Die neue URL ist in einem Location -Header enthalten, den der Webserver an den Client zurückgibt. In ASP.NET MVC führen Sie eine HTTP-Umleitung durch, indem Sie von einer Aktion ein RedirectResult zurückgeben.

Datenübergabe

Wenn Sie nur einfache Werte wie Zeichenfolgen und/oder Ganzzahlen übergeben, können Sie diese als Abfrageparameter in der URL im Header Location übergeben. Dies ist, was passieren würde, wenn Sie so etwas verwenden

return RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument });

wie andere vorgeschlagen haben

Der Grund, warum dies nicht funktioniert, ist, dass XDocument ein möglicherweise sehr komplexes Objekt ist. Es gibt keine einfache Möglichkeit für das ASP.NET MVC-Framework, das Dokument in etwas zu serialisieren, das in eine URL passt, und dann die Modellbindung vom URL-Wert zurück zu Ihrem Aktionsparameter XDocument.

Im Allgemeinen ist die Weitergabe des Dokuments an den Client, damit der Client es bei der nächsten Anforderung an den Server zurückgibt, ein sehr spröder Vorgang: Es sind alle Arten von Serialisierung und Deserialisierung erforderlich, und alle möglichen Probleme können auftreten. Wenn das Dokument groß ist, wird möglicherweise auch Bandbreite verschwendet, und die Leistung Ihrer Anwendung wird erheblich beeinträchtigt.

Stattdessen möchten Sie das Dokument auf dem Server aufbewahren und eine Kennung an den Client zurückgeben. Der Client übergibt dann die ID zusammen mit der nächsten Anforderung, und der Server ruft das Dokument unter Verwendung dieser ID ab.

Speichern von Daten zum Abrufen bei der nächsten Anforderung

Nun stellt sich die Frage, wo der Server das Dokument zwischenzeitlich speichert. Nun, das müssen Sie entscheiden und die beste Wahl hängt von Ihrem speziellen Szenario ab. Wenn dieses Dokument auf lange Sicht verfügbar sein muss, möchten Sie es möglicherweise auf der Festplatte oder in einer Datenbank speichern. Wenn es nur vorübergehende Informationen enthält, behalten Sie diese im Speicher des Webservers, im ASP.NET-Cache oder im Session (oder TempData, der in etwa dem Session am Ende) kann die richtige Lösung sein. In beiden Fällen speichern Sie das Dokument unter einem Schlüssel, mit dem Sie das Dokument später abrufen können:

int documentId = _myDocumentRepository.Save(updatedResultsDocument);

und dann geben Sie diesen Schlüssel an den Client zurück:

return RedirectToAction("UpdateConfirmation", "ApplicationPoolController ", new { id = documentId });

Wenn Sie das Dokument abrufen möchten, rufen Sie es einfach anhand des Schlüssels ab:

 public ActionResult UpdateConfirmation(int id)
 {
      XDocument doc = _myDocumentRepository.GetById(id);

      ConfirmationModel model = new ConfirmationModel(doc);

      return View(model);
 }
66
Rune

Haben Sie versucht, ASP.NET MVC TempData zu verwenden?

Das ASP.NET MVC TempData-Wörterbuch wird zum Freigeben von Daten zwischen Controlleraktionen verwendet. Der Wert von TempData bleibt so lange bestehen, bis er gelesen wird oder bis das Timeout der Sitzung des aktuellen Benutzers abgelaufen ist. Das Speichern von Daten in TempData ist in Szenarien wie der Umleitung hilfreich, wenn Werte über eine einzelne Anforderung hinaus benötigt werden.

Der Code würde ungefähr so ​​lauten:

[HttpPost]
public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)
{
    XDocument updatedResultsDocument = myService.UpdateApplicationPools();
    TempData["doc"] = updatedResultsDocument;
    return RedirectToAction("UpdateConfirmation");
}

Und im ApplicationPoolController:

public ActionResult UpdateConfirmation()
{
    if (TempData["doc"] != null)
    {
        XDocument updatedResultsDocument = (XDocument) TempData["doc"];
            ...
        return View();
    }
}
60
user1073075

Persönlich verwende ich nicht gerne TempData, aber ich übergebe lieber ein stark typisiertes Objekt, wie in Übergeben von Informationen zwischen Controllern in ASP) erläutert .Net-MVC .

Sie sollten immer einen Weg finden, es explizit und erwartet zu machen.

11
L-Four

ich bevorzuge dies anstelle von TempData

public class Home1Controller : Controller 
{
    [HttpPost]
    public ActionResult CheckBox(string date)
    {
        return RedirectToAction("ActionName", "Home2", new { Date =date });
    }
}

und ein anderer controller Action ist

public class Home2Controller : Controller 
{
    [HttpPost]
    Public ActionResult ActionName(string Date)
    {
       // do whatever with Date
       return View();
    }
}

es ist zu spät, aber ich hoffe, dass ich in Zukunft für irgendjemanden hilfreich sein kann

2
Amgad Mohamed