嵌套ViewModel中的新条目不会在ModelState.Merge()

时间:2016-09-20 10:36:55

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

我们正在使用众所周知的Post-Redirect-Get模式来防止在我们的MVC应用程序中双重发布。与大多数实现一样,我们将模型状态存储在Http-Post-Action中的TempData内,并在我们重定向到的操作中使用ModelState.Merge()恢复模型状态。这在大多数情况下非常有效,但在以下情况下我们将新元素添加到嵌套的View-Model中。

  1. 页面上的编辑器模板已刷新,并包含一个额外的嵌套视图模型元素。
  2. 在包含编辑器模板的周围视图的另一个字段中,另一个字段无效,将阻止提交到数据库并强制PRG进入错误路径(重定向到GET)。
  3. 当页面被提交时,Model-State包含新的嵌套元素Property[n+1].Value及其值,并存储在TempData中。在Merge()重定向到Get-Method的filterContext中的模型状态包含附加元素之后。
  4. 现在,当渲染视图时,新元素不会重新创建,因为它只在模型状态而不在模型中。在模型上查看创建循环(没有新的嵌套对象),EditorFor<>从模型状态获取值,这是预期的。这个问题有通用的解决方案吗?

1 个答案:

答案 0 :(得分:0)

显然没有快速解决问题的办法。我们从控制器中的错误路径上的重定向(严格PRG)切换到此blog中描述的实现。它工作得很好,甚至加速了应用程序,因为控制器错误路径上返回的json处理速度比完整的ViewResult快得多。