2009-05-12 20 views
0

Dies sollte einfach sein, aber die Antwort entzieht sich mir. Wenn ich eine Speicheraktion in meinem Controller habe und der Speichervorgang fehlschlägt, wie kann ich die Aktion abbrechen, ohne den Benutzer zu stören? Zum Beispiel wird Index stark typisierte von „MyTable“:Wie Abbrechen einer ASP.NET MVC Aktion

Function Index() As ActionResult 
    ViewData("message") = "Hello" 
    Return View(New MyTable) 
End Function 

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _ 
Function Save(ByVal form As MyTable) As ActionResult 
    Try 
     SaveMyData(form) 
     Return RedirectToAction("Index") 
    Catch 
     AddModelError("form", "An error occurred.") 
     ??? 
    End Try 
End Function 

Im Fang, wenn ich Rückansicht (Form) setzen, ich die Meldung verlieren über Viewdata übergeben. Wenn ich zum Index weiterleite, verliere ich, was der Benutzer eingegeben hat. Ich denke, ich habe den einfachen (richtigen) Weg gesehen, damit umzugehen, aber wenn Sie nicht wissen, wonach Sie suchen müssen, ist es schwer zu finden. Was vermisse ich?

Antwort

1

Im Fang, wenn ich legte Return Ansicht (Form) verliere ich die Nachricht über ViewData übergeben.

Von meinem Verständnis, Sie verlieren nicht die Nachricht über ViewData übergeben - diese Funktion läuft einfach nicht.

Und ich würde sehr davon abraten, eine Umleitung zu machen oder TempData für das zu verwenden, was Sie erreichen wollen, es hat einfach keinen Sinn und nicht die Art, wie MVC funktionieren soll.

Gehen Sie weiter, was Sie haben, ich hätte eine private Funktion, die beide Aktionen aufrufen, um die Ansicht zurückzugeben. Es hat Ihre ViewData ("Nachricht") an einem Ort und Sie haben immer noch die vorherigen Werte im Formular (und in ModelState wie Josh E sagte).

WARNUNG: VB.NET Luft Code aus einem C# Programmierer ;-)

Function Index() As ActionResult 
    Return IndexView(New MyTable) 
End Function 

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _ 
Function Save(ByVal form As MyTable) As ActionResult 
    Try 
     SaveMyData(form) 
     Return RedirectToAction("Index") 
    Catch 
     AddModelError("form", "An error occurred.") 
    End Try 

    Return IndexView(form) 
End Function 

Private Function IndexView(ByVal form As MyTable) As ActionResult 
    ViewData("message") = "Hello" 
    Return View(form) 
End Function 

HTHS, Charles

Ps. Ich möchte nur hinzufügen, dass ich es seltsam finde, dass Sie eine Indexseite haben, die zu sich selbst zurückmeldet und dann, wenn der Beitrag Fehler hat, die Indexseite wieder anzeigt, aber wenn es keine Fehler gibt, leitet sie zurück zur Indexseite .

Ich weiß nicht, was die App tut, aber es scheint, als ob Sie die Indexseite/Ansicht für viel zu viele Dinge verwenden.

+0

Hervorragender Job, der das, was ich erreichen wollte, klarstellte und erklärte, warum es so ist, wie es ist. Übrigens, das war ein künstliches Beispiel, das wahrscheinlich übermäßig vereinfacht wurde - ich versuche nicht, die Indexansicht in meiner echten App zu überladen, aber es ist immer noch gut, darauf hinzuweisen. – gfrizzle

0

Sie können TempData verwenden, um die Daten während der Umleitung aus dem Formular zu speichern und die Daten aus TempData in der Aktion "Index" abzurufen. Hier ist ein discussion of TempData.

Ihre Aktionen würde dann folgendermaßen aussehen (Pardon meine sophomoric Kenntnisse VB.Net-Syntax):

Function Index() As ActionResult 
    ViewData("message") = "Hello" 

    If TempData["FormData"] == Nothing 
     Return View(New MyTable) 
    Else 
     Return View(TempData["FormData"]) 
    EndIf 
End Function 

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _ 
Function Save(ByVal form As MyTable) As ActionResult 
    Try 
     SaveMyData(form) 
    Catch 
     AddModelError("form", "An error occurred.") 
     TempData["FormData"] = form; 
    End Try 

    Return RedirectToAction("Index") 
End Function 

TempData speichert Daten für genau eine Anfrage aus dem gleichen Host. Es ist ziemlich genau das gleiche wie die Flash Funktion in Rails.

1

Sie müssen die Formularwerte nicht explizit speichern, da sie vom Framework beibehalten werden.

Ersetzen Sie Ihr "????" mit den folgenden Ihrer Sicht auf Fehler aufmerksam wird (über die Modelstate-Eigenschaft) sowie erneut angezeigt werden die eingegebenen Werte:,

Return View(form) 
+0

Ich denke, das war, was ich dachte, war die einfache Lösung. Das Problem, auf das ich stieß, war, dass ich Dropdown-Listen nicht mit den Hilfsfunktionen erstellt hatte, die sich ihre Werte nicht erinnerten, was zu der falschen Annahme führte, dass das ganze Formular die geänderten Werte vergaß. Es sieht so aus, als ob mein Problem tiefer ist als mein (erfundenes) Beispiel.Danke, dass Sie sich dafür stark gemacht haben. – gfrizzle

Verwandte Themen