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值在post方法中变为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的范围。