c# - .NET Core MVC 视图模型中的数据持久性
问题描述
我有一个包含来自用户表单和其他数据的数据的视图模型。提交表单后,将执行服务器端验证,如果表单无效,我的代码将返回带有更新模型的视图。
// If we got this far, something failed, redisplay form
return View(model);
问题是表单中未使用的属性会丢失。提交表单后不丢失此数据的正确方法是什么?
解决方案
没有这样的“正确”方式,只是您可以根据您的用例选择不同的选项。
首先是您将所有数据发布回控制器,即为每个属性添加输入。
第二个是在重新显示表单之前再次检索丢失的数据,例如
[HttpPost]
public IActionResult SomeMethod([FromForm] SomeModel model)
{
if (!ModelState.IsValid)
{
model.Property = _repo.GetValue();
return View(model);
}
}
第三个是使用TempData
or Session
,其工作方式类似。
TempData
在这种情况下可能会更好,因为该值仅针对单个 HTTP 请求保留:
[HttpGet]
public IActionResult SomeMethod()
{
var value = _repo.GetValue();
TempData["value"] = value; // Store value in temp data
model.Property = value;
return View(model);
}
[HttpPost]
public IActionResult SomeMethod([FromForm] SomeModel model)
{
if (!ModelState.IsValid)
{
model.Property = TempData.Peek("value"); // Retrieve from temp data (may need casting)
return View(model);
}
}
注意使用TempData.Peek
而不是按键访问;这将确保如果另一个提交无效,数据将被保留,然后在提交有效后将被清除。
请注意,当使用TempData
/Session
方法时,多个窗口/选项卡可能会覆盖数据,然后这些数据将在另一个选项卡中重新出现。
会话也可能超时,这会导致值丢失。
推荐阅读
- java - Hazelcast 通过带有谓词的 MessageListener 过滤主题消息
- html - 插值内的 Angular 5 条件
- java - 有没有办法在 kotlin 中没有 Platform.runLater() 的情况下从另一个线程更新 FX-Properties?
- linux - 在ansible中找到最后一分钟内修改的最新文件?
- javascript - 如何在字符串中找到确切的单词?
- mysql - 需要有关 MySQL 分区的建议
- .net - .NET 可执行文件或 .DLL 的“即时反向”异常和?关于装配清单
- spring - 为什么我的 Spring 应用程序不能在容器中运行?
- spring-boot - Spring boot @DataJpaTest 排除过滤器不起作用
- jquery - 单击已打开的卡片内的后退按钮后如何再次显示所有卡片