Les notifications Toast ASP.NET MVC

Je suis en utilisant le Toastr plugin de notification dans mon application MVC pour afficher les messages d'état (réussite de modifier, mettre à jour, supprimer, etc), et je me demandais si il existe un moyen simple de mettre un peu de logique dans une vue Partielle et de l'avoir sur ma Mise en page ou dans chaque vue en cas de besoin.

Partielle

<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>

Vue

//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");  
}

Contrôleur

    public ActionResult SomethingAwesome(MyViewModel model)
    {
        ViewBag.Success = true;
        ViewBag.Message = "Employee successfully added";

        return RedirectToAction("Index");
    }

Cela ne fonctionne pas. Est-il possible d'envelopper quelque chose comme cela dans un partiel ou ne MVC dépouiller le <script> tags? Puis-je rendre l'partielle à l'intérieur d'un bloc de script sur la Vue?

J'ai même essayé de déplacer le code dans les balises de script directement à la Vue, puis de configurer les valeurs sur le Contrôleur et il semble que rien ne se passe.

De l'aide? Est le ViewBag effacé par le temps, la vue est rendue de nouveau? Dois-je utiliser TempData? Puis-je déplacer un Success et Message bien dans mon ViewModel et passer juste que dans ma Vue comme cela?

public ActionResult Index(MyViewModel model) 
{
    //Do something with model.Success 
}

Ma Solution

J'ai utilisé un couple de réponses à venir à une conclusion finale de cette section de mon site, et sera très probablement utiliser la méthode pour la accepté de répondre à d'autres parties.

Je suis allé et a ajouté ce qui suit à mon ViewModel

public bool Success { get; set; } 
public string Message { get; set; } 

J'ai l'Action renvoie l'Index de la vue avec le ViewModel, après les propriétés ont tous été mis en

//fetch the updated data and shove into ViewModel here
viewModel.Success = true;
viewModel.Message = "Employee successfully checked in";

return View("Index", viewModel);

Puis il suffit d'utiliser la syntaxe Razor, à mon avis,

@if (Model.Success) { 
    @:toastr.success("@Model.Message");
} else if (!Model.Success && !String.IsNullOrWhiteSpace(Model.Message)) {
    @:toastr.error("@Model.Message");   
}

Aussi comme un bonus (bien que la mise en œuvre semble bâclée), le rendu de la Partielle dans mon document.Prêt bloc

@Html.Partial("_ToastPartial", Model)

et déplacer le Toastr code de notification à l'partielle

@if (Model.Success) { 
    @:toastr.success("@Model.Message");
} else if (!Model.Success && !String.IsNullOrWhiteSpace(Model.Message)) {
    @:toastr.error("@Model.Message");   
}

Plus probable, je mettrais en place d'une interface avec le Message et Success propriétés et de faire toutes les ViewModels qui va utiliser la partielle à implémenter cette interface

D'abord, vous devez ajouter le type="text/javascript" à votre balise de script et il vous manque les guillemets dans votre javascript: @:toastr.success("@ViewBag.Message")
Merci. Modifié mon code et mise à jour de la question. Ne pas faire fonctionner comme par magie ce que je pensais
Qu'est-ce que votre navigateur de la console? Des erreurs ou des avertissements? Vous pouvez déboguer si votre ViewBag a un message simplement en collant un alert('@ViewBag.Message') dans votre ready fonction.
Hrrrm j'ai le sentiment que le ViewBag manque les valeurs après l'Indice est redirigé. Alerter les @ViewBag.Message est venu avec rien sur chaque charge
Essayez de mettre votre code javascript dans la vue principale.

OriginalL'auteur dgarbacz | 2014-04-09