Die Weitergabe der Daten vom Controller zum View, zurück zum Controller zurück, um Anzeigen
Ich bin neu ASP.NET MVC. Nach der Arbeit mit traditionellen ASP.NET Modell für so lange, es dauert einige Zeit für mich, um zu verstehen, dieses Modell.
Gehe ich durch NerdDinner, um zu verstehen, wie die Dinge funktionieren.
So, ich habe ein Objekt, das übergeben werden muss, durch einige Ansichten. Ähnlich wie die Artikel NerdDinner Schritt 6: ViewData und ViewModel.
Ich behalte die Daten von Get zu Post für die erste Zeit, dann lege ich Sie in TempData und übergeben es an einer anderen Aktion (AnotherAction). Sobald ich meine Daten Bekomme ich nicht behalten, es auf die Post.
Hier ist mein code:
public class DinnerFormViewModel
{
public Dinner Dinner { get; private set; }
public DinnerFormViewModel(Dinner dinner)
{
Dinner = dinner;
}
}
public class DinnersController : Controller
{
public ActionResult Action()
{
Dinner dinner = new Dinner();
return View(new DinnerFormViewModel(dinner));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Action(Dinner dinner, FormCollection collection)
{
try
{
//Some code
TempData["Dinner"] = dinner;
return RedirectToAction("AnotherAction");
}
catch
{
return View();
}
}
public ActionResult AnotherAction()
{
Dinner dinner = (Dinner)TempData["Dinner"]; //Got my dinner object
return View(new DinnerFormViewModel(dinner));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AnotherAction(Dinner dinner, FormCollection collection)
{
//Lost my dinner object, dinner comes in as null
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gemäß dieser blog-post TempData ist nur für 1 einzige Anforderung nach seinen Satz.
Hier ist ein Zitat aus dem post:
Nun, da der code, den ich sehe, kann man das Abendessen von TempData auf das bekommen von
AnotherAction
das ist der erste Antrag, nachdem Sie ihn aufAction
. Jedoch Blick auf den code und sehen nicht den code zur Ansicht fürAnotherAction
es ist unklar, wie Sie die Weitergabe der Daten an die post fürAnotherAction
. Das Abendessen Instanz ist nicht in TempData für diese Anfrage, weil es der zweite Antrag, nachdem Sie es in TempData. Und wenn Sie nicht die richtigen form-tags festgelegt, die auf dieAntoherAction
Ansicht wird der Rahmen nicht die richtige form Werten zu instanzieren einer dinner-Objekt in der post.Also entweder musst du reset TempData mit dem Abendessen Instanz, die es das erste
AnotherAction
rufen und rufen dann das Abendessen aus TempData in der postAnotherAction
, oder Sie können Folgen Sie dem Rat von dm und verwenden Sie ausgeblendete Felder in Ihrer Ansicht.IMO, die Sie verwenden sollten, DMs Weg, dies zu tun und vermeiden Sie die Verwendung von TempData.
Bearbeiten Hinzugefügt Beispiel rücksetzen der TempData in AnotherAction, um Zugriff zu erhalten, um es in der post.
Modell:
Controller:
Action View:
AnotherAction Anzeigen:
Das format, die Sie erwarten können Sie haben, zu füllen einige versteckte Felder, wie Sie sammeln von Informationen aus verschiedenen Ansichten.
Auch mit model verbindlich konnte Sie Ihren code anschauen, wenig besser und vermeiden TempData in den Orten:
So, in der AnotherAction Ansicht, Sie hätte so etwas wie:
Gibt es kein Benutzer-Freundlichkeit im obigen Beispiel, aber Sie erhalten den Punkt.
Du kannst nicht vorbei raw-C# - Objekte aus Sichten für die Verarbeitung Verantwortlichen.
In ASP.NET MVC, wenn eine Aktion nimmt ein Objekt für einen parameter, ASP.NET MVC sieht überhaupt die POST/GET Daten und sucht Werte, die übereinstimmen mit den Namen der Eigenschaft im parameter-Objekt.
myDinner Objekt wird NUR ausgefüllt, wenn Sie einen Beitrag in die Aktion mit Formular-Felder entsprechen dem Abendessen Eigenschaften des Objekts (Ort, Datum, etc.) oder wenn du die Informationen in einer GET-URL (Abendessen/SomeAction?Standort=chicago&Datum=12/1/2009 etc.)
Wenn Sie absolut nicht versteckte Felder (DM vorgeschlagen), dann Sitzungen ist wahrscheinlich Ihre einzige option.
Sollten Sie sich das Abendessen aus dem repository. Sie sollten sich die Maßnahmen werden wie:
BEKOMMEN Aktionen können auch aus dem repository, so können Sie geben nur die id.
BEARBEITEN
Wenn Sie wollen zu erstellen-Assistenten-Stil-Seite, speichern Sie die zuvor eingegebenen Daten im Session-Objekt.
Gespeicherten Daten in der Session bestehen durch Anfragen.