2010-07-29 13 views
26

Ich habe einen Controller, der drei Aktionen behandelt, die für mein Problem spezifisch sind.Umleiten zu Aktion und muss Daten übergeben

Die erste ist die Bearbeitungsaktion, die eine Ansicht mit einem HTML-Formular zurückgibt, mit der der Benutzer Eigenschaften für das angegebene Element bearbeiten kann.

Die zweite ist die Aktualisierungsaktion, die das Zurücksetzen des Browsers annimmt und die Datenbank aktualisiert. Wenn das Update erfolgreich ist, führen wir eine Umleitung zu Aktion durch.

Die dritte ist die Show-Aktion, die die Details des gegebenen Artikels zeigt. Auf diese Aktion werden wir nach einem erfolgreichen Update weitergeleitet.

Die Strömung ist:

Show -> Bearbeiten -> Update (Sucess: y -> Umleitung zu zeigen, n -> Rückkehr Edit)

Was ich will, ist zu erreichen, wird ein Flag ausgelöst haben Wenn das Update erfolgreich war, kann ich in der nächsten Show-Ansicht eine Bestätigungsmeldung für den Benutzer anzeigen. Das Problem ist, dass ich nicht 100% sicher bin, wie diese Daten am besten über den RedirectToAction() - Aufruf übertragen werden können. Ein Gedanke, den ich hatte, war eine Abfragezeichenfolge? Wir tragen bereits Variablen mit der Abfragezeichenfolge für einen anderen Zweck, aber ein Teil von mir ist skeptisch, dies zu missbrauchen. Der Anruf zur Weiterleitung ist unten.

Ich habe diese Frage auch gelesen, bin aber bereit, die TempData-Eigenschaft zu verwenden, wenn ich nicht muss.

Question

Dank für einige Anregungen!

Antwort

39

EDIT: Sorry, habe ursprünglich Ihre Notiz nicht über TempData verwenden möchten.

Kurz gesagt - möchten Sie, dass Ihre Nachricht erneut angezeigt wird, wenn der Client die Seite aktualisiert/neu lädt, auf die sie umgeleitet wurden?

Wenn Sie das tun, dann die Abfragezeichenfolgeflag verwenden, so etwas wie:

return(RedirectToAction("Index", new { message = "hi there!" })); 

und dann entweder definieren

public ActionResult Index(string message) { } 

oder explizit herausziehen Request.QueryString [ "message"] und geben es an die Ansicht über ViewData auf die übliche Weise. Dies funktioniert auch bei Browsern, die keine Cookies von Ihrer Site akzeptieren.

Wenn Sie nicht möchten, dass die Nachricht erneut angezeigt wird, bietet ASP.NET MVC 1.0 die TempData-Auflistung für genau diesen Zweck.

TempData Eigenschaftswerte werden in dem Sitzungszustand, bis die nächste Anforderung von demselben Browser gespeichert, wonach sie gelöscht werden - so, wenn Sie etwas in TempData setzen unmittelbar vor RedirectToAction Rückkehr, wird es auf dem Ergebnis der zur Verfügung die Weiterleitung wird aber unmittelbar danach gelöscht.

Hier ist eine einfache Änderung an den Homecontroller in dem ASP.NET MVC Startprojekt:

public ActionResult Index() { 
    ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(string submitButton) { 
    TempData["message"] = "You clicked " + submitButton; 
return(RedirectToAction("Index")); 
} 

public ActionResult About() { 
    return View(); 
} 

und die entsprechende Ansicht/Ansichten/Home/Index.

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <% if (TempData["message"] != null) { %> 
    <p><%= Html.Encode(TempData["message"]) %></p> 
    <% } %> 
    <% using (Html.BeginForm()) { %> 
    <input type="submit" name="submitButton" value="Button One" /> 
    <input type="submit" name="submitButton" value="Button Two" /> 
    <% } %> 
</asp:Content> 

Sie werden bemerken, die TempData Meldung sofort angezeigt wird nach einer POST-REDIRECT-GET-Sequenz, aber wenn Sie die Seite aktualisieren, es wird nicht wieder angezeigt werden: aspx sollte wie folgt enthalten.

Beachten Sie, dass sich dieses Verhalten in ASP.NET MVC 2 geändert hat. Weitere Informationen finden Sie unter "Übergabe des Status zwischen Aktionsmethoden" in this article.

+0

Vielen Dank für die nette Erklärung. Ich werde mir den Artikel ansehen, seit wir 2.0 haben. Ich habe in meinem Beitrag erwähnt, dass ich mich von der TempData-Eigenschaft fernhalten möchte, aber wenn das der Defacto-Weg ist, dann wird es vielleicht nicht so schlimm sein. Danke noch einmal. –

+4

Dies ist eine alte Frage, aber der Link ist jetzt gebrochen :( –

+3

Moderne (ish) Arbeitslink für diesen Artikel (scrollen Sie auf halbem Weg): http://msdn.microsoft.com/en-us/library/dd394711 (v = vs.100) .aspx – Jaxidian

4

nie ein Fan von TempData entweder gewesen und zusätzlich habe ich nicht den Erfolg Flagge in der URL übergeben will, wie ich will nicht

App/Einstellungen? SaveSuccess = true

um sehen die URL-Leiste des Browsers.

Meine Lösung verwendet ein temporäres Cookie:

[HttpPost] 
public ActionResult Settings(SettingsViewModel view) 
{ 
    if (ModelState.IsValid) 
    { 
     //save 
     Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "")); 
     return RedirectToAction("Settings"); 
    } 
    else 
    { 
     return View(view); 
    }  
} 

und in der entsprechenden Get Aktion Prüfung für das Vorhandensein dieses Plätzchen und löschen es:

[HttpGet] 
public ActionResult Settings() 
{ 
    var view = new SettingsViewModel(); 
    //fetch from db and do your mapping 
    bool saveSuccess = false; 
    if (Request.Cookies["SettingsSaveSuccess"] != null) 
    { 
     Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "") { Expires = DateTime.Now.AddDays(-1) }); 
     saveSuccess = true; 
    } 
    view.SaveSuccess = saveSuccess; 
    return View(view); 
} 

nb kann dies ein recht sein slipperly Steigung, wenn Sie beginnen, etwas komplizierter als eine boolesche Flagge übergeben

+0

Hallo - was ist die Gefahr, wenn Sie die Zeichenfolge übergeben, die die Bestätigungsmeldung an den Cookie-Wert wäre (zB Ihre Einstellungen gespeichert oder Einstellungen nicht gespeichert)? – Bartosz

+0

@Bartosz können Sie benutze einfach einen booleschen Wert und setze dann die darauf basierende Antwortnachricht Wenn die Antwortnachricht mehr als 2 Dinge sein könnte, dann musst du pragmatisch darüber sein - es fühlt sich ein bisschen falsch an - dh wenn du mehrere Fehlermeldungen hast, dann sollte es sein vor der Weiterleitung angezeigt werden - Wenn Ihre Einstellungen nicht gespeichert wurden, sollte dies von der else-Anweisung im ersten Code-Snippet behandelt werden und nicht umgeleitet werden – wal

Verwandte Themen