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