Ich versuche, ein Objekt von einer Controller-Aktion an eine andere zu übergeben. Das Objekt, das ich herumgereicht habe, sieht mehr oder weniger so aus:
%Vor%Mein Controller sieht so aus:
%Vor%Die Ergebnismethode schlägt mit einer Nullzeigerausnahme fehl, da die PhoneNumbers-Liste plötzlich null ist, nachdem die Ergebnisaktion mit der RedirectToAction () -Methode aufgerufen wurde.
Hat jemand diese Art von Verhalten schon einmal gesehen?
Prost,
Peter
Ich stimme @Dennis zu - es sei denn, du möchtest, dass sich die URL ändert, dann musst du an etwas anderes denken. Der Grund dafür ist, dass RedirectToAction die Daten nicht serialisiert, sondern einfach über die Eigenschaften im Objekt route values iteriert und eine Abfragezeichenfolge erstellt, deren Schlüssel die Eigenschaftsnamen und die Werte die Zeichenfolgendarstellung der Eigenschaftswerte sind. Wenn Sie die Url ändern möchten, ist die Verwendung von TempData wahrscheinlich der einfachste Weg, dies zu tun, obwohl Sie das Element auch in der Datenbank speichern, die ID an die Result-Methode übergeben und von dort neu erstellen können.
Müssen Sie wirklich zu der anderen Aktion umleiten? RedirectToAction
verursacht eine neue HTTP-Anfrage, weshalb TempData funktioniert. Könnten Sie nicht einfach die Aktion Result
direkt so aufrufen?
Bearbeiten Wenn Ihre App nicht mehr tut, als Sie in der Frage gezeigt haben, sieht es nicht so aus, als würden Sie die Aktion "Index" wirklich benötigen. Sie können den Code, der eine neue Person erstellt, in eine private CreatePerson
-Methode verschieben. Wenn Result
in der Aktion person
null ist, rufen Sie die Methode CreatePerson
auf. Die Index
-Aktion könnte komplett eliminiert werden, aber das würde eine Änderung Ihrer Routen erfordern. Oder lassen Sie return RedirectToAction("Result", "Dialog");
die einzige Codezeile in Ihrer Index
Aktion.
Nach der MVC-Trennung von Problemen sollte diese Methode CreatePerson
wahrscheinlich eine Methode in Ihrem Modellcode sein. Der Controller sollte nicht unbedingt die Logik zum Erstellen eines neuen Person
enthalten. Das gehört wirklich in das Modell.
Obwohl dies eine alte Frage ist, fand ich eine große Antwort darauf, was ich glaube, dass es sich um eine doppelte Frage handelt. Der Schlüssel ist der RouteValueDictionary -Konstruktor.
%Vor%Da Sie Sammlungen haben, macht es ein bisschen Tricker, aber diese andere Antwort deckt dies sehr schön .
Für alle, die wirklich eine Aktion aufrufen und die Ansicht von einem anderen Controller mit komplexem Objekt zurückgeben müssen und kein Objekt in TempData
übergeben wollen (oder können). Ich benutze in meiner App eine sehr hässliche aber funktionierende Lösung:
Inspiriert von der hier gefundenen Antwort: Ссылка
Tags und Links asp.net-mvc