我在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。我错过了什么吗?
答案 0 :(得分:0)
使用Razor渲染视图后,ViewBag将被清空。它只对客户的一次旅行有好处,然后它被擦除。如果您希望在客户端回拨服务器时能够在Controller中将其读回,则您需要使用TempData
代替。
即使您在Controller Action中执行了Redirect()
,您的ViewBag数据也会丢失,因为您正在移动到第二页,而且超出了ViewBag的范围。
答案 1 :(得分:0)
只有在从控制器设置ViewBag时,才能在View中访问ViewBag,当发布表单时,ViewBag值将被删除,如果您希望在表单中可以访问这些值,则可以通过隐藏字段发布它们。
<input type="hidden" name="MyHidden" value="@ViewBag.AnyKey"/>
或其他方式是使用 TempData ,而不是放在viewbag中,将数据放在 TempData 中并记住TempData曾经被读过,意味着一旦你读取它的值它将从 TempData 中删除,您可以通过调用TempData.Keep()
public ActionResult MyAction() { TempData [&#34; myKey&#34;] =&#34;&#34 ;; }
和查看:
@{
string value = TempData["myKey"] as stirng;
TempData.Keep("myKey") // retains value in TempData
}