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?
HTTP und Weiterleitungen
Lassen Sie uns zunächst noch einmal zusammenfassen, wie ASP.NET MVC funktioniert:
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);
}
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();
}
}
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.
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