5

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

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

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

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

我的控制器如下:

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

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

     return RedirectToAction("Create");
}

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

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

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

4

2 回答 2

1

我怀疑[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"];
于 2013-01-15T16:57:02.467 回答
0

检查此链接 http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg,您需要在其中使用 ModelStateTempDataTransfer 模板 onActionExecution

于 2013-01-15T16:41:34.933 回答