gpt4 book ai didi

c# - 带子项的 MVC PRG 模式

转载 作者:太空狗 更新时间:2023-10-29 23:46:52 28 4
gpt4 key购买 nike

我正在尝试使用 [ImportModelStateFromTempData][ExportModelStateToTempData] 操作过滤器来实现 PRG 模式。这种模式非常适合平面模型,但当我有一个子系列时我无法让它工作。我的模型如下所示:

public class QuestionModel
{
public string QuestionText { get; set; }

public ICollection<ChoiceModel> Choices { get; set; }
}

public class ChoiceModel
{
public string ChoiceText { get; set; }
}

我的 Controller 如下:

[HttpGet, ImportModelStateFromTempData]
public ActionResult Create()
{
return View();
}

[HttpPost, ExportModelStateToTempData]
public ActionResult Create(QuestionModel model)
{
if(ModelState.IsValid)
{
// not getting here
}

return RedirectToAction("Create");
}

我的 View 允许用户向选项中添加新项目,并且我有一个选项必须是唯一的验证。当我的 ModelState 无效时,它会将 ModelState 打包成 TempData 并重定向到 HttpGet 操作。

此时我所有的子模型值都在 ModelState 中,但它在将模型传递给 View 时不会重建它们,因此我的 View 显示添加了 0 个子模型。

有没有办法以某种方式将 ModelState 与 Model 合并,或者我不能将此模式用于子对象吗?

最佳答案

我怀疑 [ImportModelStateFromTempData] 会从 ModelState 重建模型,我想象它只是获取用户尝试的值验证错误,因此由于此时模型集合未初始化 (GET) 并且您未从 POST 传递集合,它只会呈现模型初始状态,这就是为什么它适用于平面模型但不适用于本例中的集合。

因此您必须找到一种方法将该集合或孔模型从 POST 传递到 GET 操作,选项是 TempData。

//POST - if validation fails
TempData["model"] = model;

//GET - must check if TempData["model"] is null first
QuestionModel model = (QuestionModel)TempData["model"];

关于c# - 带子项的 MVC PRG 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14265695/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com