Toast-Benachrichtigungen in ASP.NET MVC
Ich bin mit den Toastr notification-plugin in meinem MVC-Anwendung zum anzeigen von status-Nachrichten (erfolgreich Bearbeiten, aktualisieren, löschen, etc), und ich Frage mich, ob es einen einfachen Weg, um eine gewisse Logik in einer Teilweisen Ansicht und habe es auf meinem Layout und in jedem einzelnen Blick, wo nötig.
Teilweise
<script type="text/javascript">
$(document).ready(function () {
@if (ViewBag.Success == true) {
@:toastr.success("@ViewBag.Message");
} else if (ViewBag.Success == false) {
@:toastr.error("@ViewBag.Message");
}
});
</script>
Ansicht
//Doesn't work
@Html.Partial("_ToastPartial")
//Tried this directly in the view instead of using the partial, didn't work
@if (ViewBag.Success == true) {
@:toastr.success("@ViewBag.Message");
} else if (ViewBag.Success == false) {
@:toastr.error("@ViewBag.Message");
}
Controller
public ActionResult SomethingAwesome(MyViewModel model)
{
ViewBag.Success = true;
ViewBag.Message = "Employee successfully added";
return RedirectToAction("Index");
}
Funktioniert das nicht. Ist es möglich, wickeln Sie etwas wie dies in einem Teil-oder nicht-MVC-Streifen aus der <script>
- tags? Kann ich render die teilweise innerhalb eines script-Blocks auf die Aussicht?
Ich habe sogar versucht, um den code innerhalb des script-tags direkt an die Ansicht festlegen und dann die Werte auf dem Controller, und es scheint, wie nichts passiert.
Hilfe? Ist der ViewBag gelöscht, indem die Zeit, die der Ansicht ist erneut gerendert? Sollte ich TempData? Kann ich eine Success
und Message
Eigenschaft in meinem ViewModel und nur passieren, dass in meiner Ansicht wie diese?
public ActionResult Index(MyViewModel model)
{
//Do something with model.Success
}
Meine Lösung
Ich ein paar Antworten kommen zu einem endgültigen Fazit für diesen Abschnitt meiner Website, und wahrscheinlich verwenden Sie die Methode für die akzeptierte Antwort, die in anderen teilen.
Ging ich und fügte hinzu, die folgenden zu meinem ViewModel
public bool Success { get; set; }
public string Message { get; set; }
Habe ich die Aktion " zurück, die Index-view mit dem ViewModel, nach Eigenschaften haben alle
//fetch the updated data and shove into ViewModel here
viewModel.Success = true;
viewModel.Message = "Employee successfully checked in";
return View("Index", viewModel);
Dann verwenden Sie einfach die Razor-syntax in meiner Sicht
@if (Model.Success) {
@:toastr.success("@Model.Message");
} else if (!Model.Success && !String.IsNullOrWhiteSpace(Model.Message)) {
@:toastr.error("@Model.Message");
}
Auch als bonus (obwohl die Umsetzung scheint schlampig), render die Teilweise in meinem Dokument.Ready block
@Html.Partial("_ToastPartial", Model)
bewegen und die Toastr-Benachrichtigung-code, um die teilweise
@if (Model.Success) {
@:toastr.success("@Model.Message");
} else if (!Model.Success && !String.IsNullOrWhiteSpace(Model.Message)) {
@:toastr.error("@Model.Message");
}
Wahrscheinlich würde ich die Einrichtung einer Schnittstelle mit der Message
und Success
Eigenschaften und alle ViewModels, die teilweise implementieren die Schnittstelle
- Zuerst sollten Sie die
type="text/javascript"
zu Ihrem script-tag und dir fehlen die Anführungszeichen im javascript:@:toastr.success("@ViewBag.Message")
- Danke. Verändert mein code und aktualisiert die Frage. Nicht damit es funktioniert magisch, wie ich dachte, es würde
- Was macht Ihre browser-Konsole Aussehen? Fehler oder Warnungen? Sie Debuggen können, ob Ihre ViewBag hat eine Nachricht nur durch kleben ein
alert('@ViewBag.Message')
in Ihreready
Funktion. - Hrrrm, ich habe ein Gefühl der ViewBag fehlen die Werte nach der die Index weitergeleitet wird. Die Alarmierung der
@ViewBag.Message
kam mit nichts, auf jeden laden - Versuchen Sie, Ihre javascript in der Hauptansicht.
- Aktualisiert die Frage, um zu zeigen, das Rasiermesser + Javascript aus meiner Sicht direkt als etwas, das ich versuchte. Noch hat nicht funktioniert.
- Warum haben Sie sich entschieden, RedirectToAction im Gegensatz zu
return View("Index");
? Siehe unten. - Ich kann entweder zu tun, keinen Grund, nicht zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem controller ist die Durchführung einer
RedirectToAction
. Die ViewBag-und ViewData-nur der überlebt, der aktuellen Anforderung. TempData ist die Sache zu verwenden, wenn Sie verwenden, leitet dann (und nur dann):http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications Staaten dies deutlich:
Wer auf der Suche nach einer Antwort, die ich gefunden habe, ein nützlicher Artikel über die Implementierung von Toastr über MVC hier.
Erstellen einer MVC-wrapper für Toastr
Verwendung dieses nuget-Paket, es war für mich sehr einfach zu verwenden, toastr in mvc.
Ich bin ein bisschen überrascht, dass es nicht mehr verwendet...
https://www.nuget.org/packages/RedWillow.MvcToastrFlash
Versuchen, Diese Bibliothek NtoastNotify wenn Sie sich für eine Umsetzung auf ASP.NET core. (Disclaimer: der Autor hier)