ViewBag值在post方法中变为null
本文关键字:null 方法 值在 post ViewBag | 更新日期: 2023-09-27 17:57:55
我在Edit get方法中有以下代码。
public async Task<ActionResult> Edit(int? id)
{
Event e = await db.Events.FindAsync(id);
ViewBag.OldCategories = e.Categories.ToList();
// ViewBag.OldCategories is not null (tested in VS quick viewer)
我在post方法中有以下代码。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "Id,....,Categories")] EventCreateViewModel eventVm)
{
var oldCategories = ViewBag.OldCategories; // Null
但是,在post方法中,oldCategories始终为null。我错过什么了吗?
ViewBag只有在从控制器设置时才能在View中访问,当表单发布时ViewBag值被删除,如果您希望在表单发布中访问这些值,您可以通过隐藏字段发布它们。
<input type="hidden" name="MyHidden" value="@ViewBag.AnyKey"/>
或者其他方法是使用TempData,而不是放在viewbag中,将数据放在TempDataempData中删除,您可以通过调用TempData.Keep()
来保留它
public ActionResult MyAction()
{
TempData["myKey"] = "";
}
和视图:
@{
string value = TempData["myKey"] as stirng;
TempData.Keep("myKey") // retains value in TempData
}
使用Razor渲染视图后,ViewBag将清空。它只适合去客户那里一次,然后就被抹去了。如果您希望在客户端回调到服务器时能够在控制器中读取它,则需要使用TempData
。
即使您在控制器操作中执行Redirect()
,您的ViewBag数据也会丢失,因为您正在移动到第二个页面,并且超出了ViewBag的范围。