ASP.NET MVC中的Toast通知

dga*_*acz 8 javascript c# asp.net asp.net-mvc

我正在使用我的MVC应用程序中的Toastr通知插件来显示状态消息(成功编辑,更新,删除等),我想知道是否有一种简单的方法可以将某些逻辑放在部分视图中并将其打开我的布局或在需要的每个单独视图中.

局部

<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>
Run Code Online (Sandbox Code Playgroud)

视图

//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");  
}
Run Code Online (Sandbox Code Playgroud)

调节器

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

        return RedirectToAction("Index");
    }
Run Code Online (Sandbox Code Playgroud)

这不起作用.是否有可能将这样的东西包装成部分或MVC剥离<script>标签?我可以在视图上的脚本块中渲染部分吗?

我甚至尝试将脚本标记中的代码直接移动到View,然后在Controller上设置值,似乎什么也没发生.

有帮助吗?ViewBag是否在再次渲染视图时被清除?我应该使用TempData吗?我可以将一个SuccessMessage属性移动到我的ViewModel中,然后将其传递到我的View中吗?

public ActionResult Index(MyViewModel model) 
{
    //Do something with model.Success 
}
Run Code Online (Sandbox Code Playgroud)

我的解决方案

我使用了几个答案来得出我网站的这一部分的最终结论,并且很可能将该方法用于其他部分的接受答案.

我去了,并将以下内容添加到我的ViewModel中

public bool Success { get; set; } 
public string Message { get; set; } 
Run Code Online (Sandbox Code Playgroud)

在完全设置了属性之后,我让Action返回带有ViewModel的Index视图

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

return View("Index", viewModel);
Run Code Online (Sandbox Code Playgroud)

然后在我的视图中使用Razor语法

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

另外作为奖励(虽然实现看似草率),在我的文档中渲染部分.准备块

@Html.Partial("_ToastPartial", Model)
Run Code Online (Sandbox Code Playgroud)

并将Toastr通知代码移动到partial

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

我很可能会设置一个带有MessageSuccess属性的接口,并制作任何将使用该接口的部分实现的ViewModel

Pet*_*ete 8

你的控制器正在执行RedirectToAction.ViewBag和ViewData仅在当前请求中存活.TempData是您在使用重定向时使用的东西(仅限于此):

http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications明确指出:

[...] TempData对象在一个基本场景中运行良好:

  • 在当前和下一个HTTP请求之间传递数据