2010-01-26 9 views
14

Für Fehlermeldungen, Validierung Fehler usw. Sie habenErfolgsmeldungen im Gegensatz zu staatlichen Fehlermeldungen

ModelState.AddErrorMessage("Fool!"); 

Aber zu modellieren, wo Sie Erfolg haben Antworten setzen wie „Sie haben erfolgreich eine Menge Geld zu Ihrem Ex übertragen.“ + "Ihr Guthaben ist jetzt Null". Ich möchte immer noch auf der Controller-Ebene und vorzugsweise in Schlüssel-Wert-Weise, wie Fehlermeldungen, aber ohne den Modellstatus ungültig.

Wie wird das normalerweise gemacht? Daten anzeigen?

+0

Können Sie es gerade grün machen? – Scozzard

+1

Ich habe diese Option nicht untersucht, aber haben Sie erwogen, das ModelState-Objekt so zu erweitern, dass es sowohl Erfolgsmeldungen als auch Fehlermeldungen enthält? – Odd

Antwort

21

Ich würde bevölkern TempData [ "Erfolg"] (oder was auch immer Sie eingeben Ich möchte es mit der Nachricht geben, die ich im Controller anzeigen möchte, und dann entsprechend umleiten (zB wenn ich einen Benutzer editiere, leite ich zurück zur Benutzerliste). Dies beruht auf dem POST/Redirect/GET-Muster - was ohnehin eine gute Praxis ist.

In der Masterseite habe ich einen Abschnitt, der diese Variable überprüft und die Nachricht in einem netten gestylten div anzeigt. Etwas wie (möglicherweise nicht 100% korrekt):

<% if(TempData["success"] != null) { %> 
     <div id="SuccessMessage"><%= Html.Encode(TempData["success"]) %><div> 
<% } %> 
+1

Wenn Sie das Post/Redirect/Get-Muster nicht verwenden möchten, können Sie ViewData anstelle von TempData verwenden, um den Wert zu speichern. Ich würde sehr empfehlen, Post/Redirect/Get though zu verwenden ... – Rosstified

+0

Das macht viel Sinn. Wo lernst du so etwas? – Martin

+0

In neueren MVC können Sie das gleiche mit [ViewBag.Success'] tun (http://rachelappel.com/when-to-use-viewbag-viewdata---tempdata-in-asp.net-mvc- 3-Anwendungen) – drzaus

7

ich Sie annehmen könnte die Model überprüfen und eine Variable im Modell gesetzt ...

public ActionResult MyAction(MyEntity model) 
{ 
    //Here would be some validation, which returns with ModelState errors 

    //Now set the validity of the modelstate as the IsValid property in your entity 
    model.IsValid = ModelState.IsValid; 

    return View(model); 
} 

Ihrer Ansicht nach ...

<% if(Model.IsValid) { %> 
    <p>You successfully transfered your balance to your ex.</p> 
<% } %> 

Edit: Ihre aktualisierte Frage gegeben, Ich denke, du betrachtest den falschen Ansatz. Ich würde mit den anderen Antworten gehen und einem PRG pattern folgen. Dies ist definitiv sinnvoller als der Versuch, einen falschen Fehler hinzuzufügen.

+0

Hey Dan, komm wieder zu meiner Rettung. Dies gibt mir nur eine mögliche Antwort. Ich werde die Frage umformulieren. – Martin

+0

wird eine erfolgreiche Nachricht beim ersten Besuch der Seite angezeigt? Weil ModelState auch gültig ist. – Muflix

+1

@Muflix Das ist eine gute Frage. Der obige Code ist für eine "POST" -Anforderung, so dass eine "GET" -Anforderung diesen Code nicht treffen würde. Der Standardwert für einen booleschen Wert ist ebenfalls 'false'. Wenn Sie 'IsValid' in der ersten Anforderung nicht explizit auf 'true' setzen, sollte dies kein Problem darstellen. –

0

Sie sollten etwas wie das POST/Redirect/GET-Muster und "Redirect" in eine andere Ansicht am Ende Ihrer Aktionsmethoden implementieren, nachdem alle Validierungen verifiziert und alles ordnungsgemäß ausgeführt wurde. Sie können die gesamte Objektinstanz an die Zielansicht übergeben oder Sie geben nur eine einfache Textnachricht aus, oder Sie können den Text in der Zielansicht selbst aus web.config oder aus der Ressourcendatei herausziehen.

Zum Beispiel habe ich eine Ansicht im freigegebenen Ordner namens "ChangeSuccess.aspx", auf die ich umleiten für alle meine erfolgreichen Änderungen & erstellt.

You "redirect" wie diese

return View("ChangeSuccess", objectInstance); 

(Anmerkung: nicht wirklich umleiten, siehe Kommentare)

+1

Ich bin mir fast sicher, dass 'return View' ** keine Umleitung ** durchführt, sondern dass unterschiedliche Inhalte von derselben Antwort zurückgegeben werden.Ich denke, du meintest, 'this.Redirect (" new-url ")' oder 'return this.RedirectToAction (...)' zurückzugeben. – drzaus

+0

Obwohl dies eine alte Frage ist, sind Sie in Ihrem Kommentar gleich. Die obige Zeile führt keine Umleitung durch, sondern rendert eine andere Ansicht mit dem angegebenen Modell. – mare

Verwandte Themen