我的ViewBag无法正常工作的原因是什么?

时间:2015-12-24 04:39:10

标签: asp.net-mvc

我在ActionResult中关注了controller,您可以看到我在ViewBag中设置了一条消息,如果它成功了。然后在View它应该输出该消息,如果它不是空的。但是,我无法显示消息,而且我没有看到问题所在。

[HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                context.Roles.Add(new Microsoft.AspNet.Identity.EntityFramework.IdentityRole()
                {
                    Name = collection["RoleName"]
                });
                context.SaveChanges();

                ViewBag.ResultMessage = "Role created successfully.";
                return RedirectToAction("Index");
            }
            catch (Exception)
            {
                return View();
            }            
        }

这是我的Index.cshtml

@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>
@{
    ViewBag.Title = "Index";
}

<h2>Roles Listing </h2>

@ViewBag.ResultMessage

@Html.ActionLink("Create New Role", "Create") | @Html.ActionLink("Manage User Role", "ManageUserRoles")

<div>
    <table class="table table-bordered table-condensed table-striped table-hover ">
        <thead>
            <tr>
                <th>Role</th>
                <th>Action</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var role in Model)
            {
                <tr>
                    <td><strong>@role.Name</strong></td>
                    <td>
                        <span onclick="return confirm('Are you sure you want to delete @role.Name?')"><a href="/Roles/Delete?RoleName=@role.Name" class="delLink" style="color:red;">Delete</a></span> |
                        @Html.ActionLink("Edit", "Edit", new { roleName = @role.Name })
                    </td>
                </tr>
            }
        </tbody>
    </table>
</div>

3 个答案:

答案 0 :(得分:7)

当您从ViewBag移至controller时,

view有助于维护数据。短寿命意味着当重定向发生时,值变为空。这是因为他们的目标是提供在controllersviews之间进行通信的方式。它是服务器调用中的通信机制。

由于您使用的是RedirectToActionViewBag在到达null时会变为view

您可以使用TempData

TempData["ResultMessage"] = "Role created successfully.";

它使用Session作为存储,但在第二次响应后它不会出现。 当您从一个TempData移动到另一个controller或从一个操作移动到其他操作时,controller有助于维护数据。换句话说,当您重定向时,Tempdata有助于维护这些重定向之间的数据。它在内部使用会话变量。在当前和后续请求期间使用TempData仅表示在您确定下一个请求将重定向到下一个视图时使用它。

有关此问题的更多信息,请参阅此link

答案 1 :(得分:2)

  

ViewBag属性使您可以动态共享来自的值   控制器到视图。 (MSDN

它的生命仅在当前请求期间存在,如果发生重定向,则它的值变为空。 由于您使用RedirectToAction重定向到某个不同的控制器,因此ViewBag的值将丢失。

请考虑使用TempData

TempData["ResultMessage"] = "Role created successfully.";

(有关用法,请参阅this

答案 2 :(得分:0)

viewbag / viewdata范围仅供控制器查看。如果您使用tempdata,它将提供一个请求,您可以扩展多个请求