RedirectToAction (..) mit komplexem Deep-Objekt schlägt fehl

9

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

    
DaveRandom 29.08.2009, 18:09
quelle

4 Antworten

5

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.

    
tvanfosson 29.08.2009, 18:57
quelle
7

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?

%Vor%

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.

    
CoderDennis 29.08.2009 18:27
quelle
2

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 .

    
mateuscb 05.03.2014 18:05
quelle
0

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:

%Vor%

Inspiriert von der hier gefundenen Antwort: Ссылка

    
Gh61 17.03.2015 20:06
quelle

Tags und Links