带孩子的MVC PRG模式

时间:2013-01-10 19:24:29

标签: c# asp.net-mvc post-redirect-get

我正在尝试使用[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; }
}

我的控制器如下:

[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与模型合并,或者我可以不将此模式与子对象一起使用?

2 个答案:

答案 0 :(得分:1)

我怀疑[ImportModelStateFromTempData]会从ModelState重建模型,我只是为了获取 用户尝试的值 验证错误 ,因为此时模型集合未初始化(GET)并且您没有从POST传递集合,它只会渲染模型初始状态,这就是它工作的原因很好的平面模型,但没有像这种情况下的集合。

所以你必须找到一种方法将该集合或洞模型从POST传递给GET Action,并且选项是TempData。

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

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

答案 1 :(得分:0)

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