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 Ihre ready 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.

InformationsquelleAutor dgarbacz | 2014-04-09
Schreibe einen Kommentar