【发布时间】:2019-05-21 08:57:45
【问题描述】:
有很多人主张在 .NET Core 2.2.x 中使用带有 PRG 模式的 TempData。
据我了解,这行代码是存储数据的:
TempData["foo"] = JsonConvert.SerializeObject(model);
以下内容会重构模型,然后将其从 TempData 构造中删除:
string s = (string)TempData["Model"];
var model = JsonConvert.DeserializeObject<ModelType>(s);
因此,鉴于 TempData 的这种瞬态特性,请想象以下 PRG 构造。用户 POST 到 UserInfo 操作,该操作将模型打包到 TempData 并重定向到 UserInfo GET。 GET UserInfo 重构模型并显示视图。
[HttpPost]
public IActionResult UserInfo(DataCollectionModel model) {
TempData["Model"] = JsonConvert.SerializeObject(model);
return RedirectToAction("UserInfo");
}
[HttpGet]
public IActionResult UserInfo() {
string s = (string)TempData["Model"];
DataCollectionModel model = JsonConvert.DeserializeObject<DataCollectionModel>(s);
return View(model);
}
用户现在位于 /Controller/UserInfo 页面上。如果用户按 F5 刷新页面,TempData["Model"] 将不再存在,UserInfo 上的 GET 将失败。修复可能是在读取模型后将模型存储在 TempData 中,但这不会导致内存泄漏吗?
我错过了什么吗?
【问题讨论】:
-
TempData通常用于敏感信息。 PRG 不需要。 -
@Jasen 您将使用什么方法将信息从 POST 移动到 GET? (我没有数据库,因此不能使用 ID 传递)。
-
如果您想在第一次访问后保留数据,会话状态将是 TempData 的逻辑替代方案。
-
@DaveCluderay 该应用程序将设置在多台服务器上,因此单机会话状态将不起作用,我认为仅为 PRG 模式引入分布式缓存会有点过头了。可能会使用 cookie 或类似的东西。
标签: c# .net asp.net-core .net-core asp.net-core-2.2