我在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>
答案 0 :(得分:7)
ViewBag
移至controller
时, view
有助于维护数据。短寿命意味着当重定向发生时,值变为空。这是因为他们的目标是提供在controllers
和views
之间进行通信的方式。它是服务器调用中的通信机制。
由于您使用的是RedirectToAction
,ViewBag
在到达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,它将提供一个请求,您可以扩展多个请求