首页 > 解决方案 > .NET Core MVC 视图模型中的数据持久性

问题描述

我有一个包含来自用户表单和其他数据的数据的视图模型。提交表单后,将执行服务器端验证,如果表单无效,我的代码将返回带有更新模型的视图。

// If we got this far, something failed, redisplay form
return View(model);

问题是表单中未使用的属性会丢失。提交表单后不丢失此数据的正确方法是什么?

标签: c#.netasp.net-mvcasp.net-core

解决方案


没有这样的“正确”方式,只是您可以根据您的用例选择不同的选项。

首先是您将所有数据发布回控制器,即为每个属性添加输入。

第二个是在重新显示表单之前再次检索丢失的数据,例如

[HttpPost]
public IActionResult SomeMethod([FromForm] SomeModel model)
{
    if (!ModelState.IsValid)
    {
        model.Property = _repo.GetValue();
        return View(model);
    }
}

第三个是使用TempDataor 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方法时,多个窗口/选项卡可能会覆盖数据,然后这些数据将在另一个选项卡中重新出现。

会话也可能超时,这会导致值丢失。


推荐阅读