Ein häufiges Szenario, das mir begegnet, ist die Bereitstellung von Benachrichtigungen/Bestätigungen für Benutzer, nachdem sie eine Aktion durchgeführt haben, um sie über den Erfolg zu informieren.
Nehmen wir zum Beispiel an, ein Benutzer gibt ein Feedback in einem Feedback-Formular und klickt dann auf Feedback abgeben . Möglicherweise möchten Sie eine Nachricht "Danke für Ihr Feedback" anzeigen 後 Sie haben eine Validierung durchgeführt, z. B. haben sie eine gültige E-Mail in der Datenbank. Einige Pseudocode:
public ActionResult SubmitFeedback(string Feedback, int UserID)
{
MyDataContext db = new DataContext()
if(db.usp_HasValidEmail(UserID)) //Check user has provided a valid email
return View("Index"); //Return view and display confirmation
else
ModelState.AddModelError("InvalidEmail", "We do not hold an email record for you. Please add one below");
return View("Index);
}
Ich weiß, wie man Einträge validiert, indem man Html.ValidationMessage
usw. Das ist in Ordnung, und ich überprüfe in der Regel auf ungültige Einträge entweder mit jQuery auf der Client-Seite oder früh in meiner Aktion (d. h. bevor ich auf die Datenbank zugreife) und beende meine Aktion, wenn es ungültige Einträge gibt.
Wie sieht es jedoch aus, wenn alle Einträge gültig sind und Sie eine Bestätigungsmeldung anzeigen möchten?
Option 1 : Haben Sie eine völlig separate Ansicht
Dies scheint gegen die DRY-Prinzipien zu verstoßen, da eine völlig neue Ansicht (und ein neues ViewModel) benötigt wird, um fast identische Informationen anzuzeigen, mit Ausnahme der Benutzerbenachrichtigung.
Option 2 : Bedingte Logik in der Ansicht
In diesem Szenario könnte ich eine bedingte Anweisung in der Ansicht haben, die das Vorhandensein einiger TempData überprüft, die in der SubmitFeedback
Aktion. Nochmals, Pseudocode:
<% if(TempData["UserNotification"] != null {%>
<div class="notification">Thanks for your Feedback!</div>
<% } %>
Option 3 : Verwenden Sie jQuery, um beim Laden der Seite nach TempData zu suchen
In diesem Szenario würde ich ein verborgenes Feld haben, das ich mit TempData über die SubmitFeedback
Aktion. Ich würde dann jQuery verwenden, um den Wert des verborgenen Feldes zu überprüfen. Mehr Pseudocode:
<%=Html.Hidden("HiddenField", TempData["UserNotification"])%> //in View
$(document).ready(function() {
if ($("input[name='HiddenField']").length > 0)
$('div.notification').show();
setTimeout(function() { $('div.notification').fadeOut(); }, 3000);
});
Meine ersten Gedanken dazu sind:
- Option 1: Vollständige Trennung der Ansichten, scheint aber übertrieben und ineffizient zu sein (verstößt gegen DRY)
- Option 2: Einfach genug, aber mit bedingter Logik in der Ansicht (werde ich dafür nicht auf dem MVC-Altar geopfert?!?)
- Option 3: Ich habe das Gefühl, dass es die Dinge zu sehr verkompliziert. Es vermeidet jedoch Logik in der Ansicht.
Was sagen Sie dazu? Option 1, 2, 3 oder keine? Gibt es einen besseren Weg?
Bitte ergänzen Sie meine Kodierungsmuster!