我很困惑,将数据从一个ActionResult
传递到另一个ActionResult
方法。
这是关于我的描述,
我需要将值从一个方法传递到另一个方法,并且该值必须在我从另一个方法渲染的视图中可用。
我在项目中看到的是这个(这是编辑,但[HttpPost
]编辑,它也会重定向到编辑,但[HttpGet
]的[HttpPost
]内容被导入):
TempData["Success"] = True;
return RedirectToAction("Edit/" + customer.Id, "Customer");
做了什么 [HttpGet]编辑:
if (TempData["Success"] != null && TempData.ContainsKey("Success"))
ViewBag.Success = Convert.ToString(TempData["Success"]);
return View(model);
正如您所见,[HttpPost
] TempData["Success"]
上的人设置为True
;
并重定向到[HttpGet
]方法,并编写下一个代码:
if (TempData["Success"] != null && TempData.ContainsKey("Success"))
ViewBag.Success = Convert.ToString(TempData["Success"]);
return View(model);
所以我想知道为什么需要根据TempData
设置值TempDate
的值来设置ViewBag
及以后,可以&# 39;我只是在重定向之前在我的第一个ActionResult上设置ViewBag的值,所以即使从HttpGet
动作结果呈现/调用视图,它也可以在View上使用?
例如:
而不是:
TempData["Success"] = True;
return RedirectToAction("Edit/" + customer.Id, "Customer");
我可以简单地写一下HttpPost
ViewBag.Success = True;
return RedirectToAction("Edit/" + customer.Id, "Customer");
或者需要使用TempData
来完成此操作,因为如果我没有在重定向到的ActionResult上为其添加值,ViewBag
将无法在视图中显示一个视图,在这种情况下它是HttpGet而不是HttpPost(这意味着我需要在HttpGet上设置ViewBag值?)
如果我必须这样做,我也可以使用两个ViewBag,而不是ViewBag和TempData?
为什么有人会像这样解决它?这是正确的方法还是什么?
答案 0 :(得分:0)
有几种技术可以实现Post / Redirect / Get模式。
TempData是传递单个重定向信息的一种方法。这种方法的缺点是,如果用户在最终重定向页面上点击刷新(F5),他将无法再提取数据,因为它将从TempData中消失以用于后续请求。
另外两种方法是查询字符串参数和持久性。
答案 1 :(得分:0)
我不能在之前的第一个ActionResult上设置ViewBag的值 重定向,因此它也可以在视图
上使用
你不能,因为 Http是无国籍的 。因此,我们使用 TempData 来存储临时数据,以便保留Http请求。
为什么有人会像这样解决它?它是否正确 接近还是什么?
对于ASP.NET MVC而言,这种方法很好,因为我们没有其他方法可以在Http请求之间保留临时数据。
如果您经常看到自己这样做,可能需要考虑使用alert extension methods在烤箱内显示消息。
<强> Usage 强>
[HttpPost]
public ActionResult Edit(SettingModel model)
{
if (ModelState.IsValid)
{
...
return RedirectToAction("List")
.WithSuccess($"Setting was updated successfully.");
}
return View(model);
}
答案 2 :(得分:0)
在这种情况下,不能使用第一个ViewBag
,因为您正在进行重定向。重定向意味着在特定操作/控制器上发出完整请求。 ViewBag
本质上仅用于在单个请求中将数据从操作传递到视图,这意味着重定向将擦除ViewBag
中保存的所有数据。在这种情况下,我认为唯一最好的方法是使用TempData
,因为即使进行重定向也会保留数据,但是当在同一个控制器中进行重定向时 ,所以如果你做的话重定向到另一个控制器,最终会丢失在TempData
对象中注册的数据。
我可以看到您正在尝试找到一种方法来提醒用户注意不同的通知,但您可以在该方法的详细信息中看到我的回答here: