【问题标题】:Editing collections and disabling form persistance编辑集合和禁用表单持久性
【发布时间】:2011-02-18 03:28:47
【问题描述】:

是否有针对特定请求禁用 MVC 从表单数据“重新填充”?

我正在开发一个 MVC 示例,用于编辑“购物车”,其中包含一个简单的商品列表及其数量。到目前为止,很典型。

我正在使用编辑器模板,这样我就可以在项目列表上使用EditorFor,而MVC 将生成Items[x] 字段前缀,并在回帖中为我提供基本免费的模型绑定。

部分示例是删除帖子之间数量为零的项目。不幸的是,由于 HTML 辅助方法优先于模型值的表单值,这导致项目的 number 减少,但之前发布的项目的 form data那个位置。该行的未发布数据显然仍然正确。

注意。我意识到这里通常会使用 PRG 模式,但由于这是一个示例,因此没有持久层(我依赖于表单数据 + 静态产品存储库实现)。

编辑:要明确的是,我并不是在反对 PRG 模式,该示例只是突出显示模型绑定器和服务器端验证。

【问题讨论】:

  • PRG 模式不仅仅关乎持久性——它关乎尊重网络的工作方式。在没有实现 PRG 模式的情况下,如果用户使用“返回”按钮返回表单,所有数据都将重新发布。请记住,回发反模式完全被破坏了。
  • @Richard 在 ASP.NET MVC 中没有“回发”。
  • @George - HTTP 中有一个 POST 方法。我很清楚 ASP.NET MVC 在 Page 上没有 PostBack 属性,可能是因为它没有 Page 类。
  • @rsenna - 我知道为什么应该使用 PRG 模式。该示例用于内部培训,作为向已经普遍精通的多平台开发人员教授 ASP.NET MVC 细节的一种方式。
  • @Richard POST != 回发。在你想要另一个的地方使用一个是灾难的秘诀。

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

好的,好像是我遇到的问题:Strange behaviour in ASP.NET MVC: removing item from a list in a nested structure always removes the last item

我找到的解决方案是清除 ModelState,然后填充您需要的内容。

PRG 也是可能的,您必须将模型和模型状态临时存储在会话和 GET 中,从会话中检索并删除。这正是ASP NET MVC Contrib 2ActionFilter PassParametersDuringRedirect 中所做的事情。

【讨论】:

  • 我不知道 ModelState.Clear(),谢谢。关于会话状态的好点,虽然我试图避免它。
  • 我不喜欢使用 session 但似乎没有其他选择。 MVC contrib 也使用它。如果您找到更好的方法,请告诉我。
  • 我的意思是为了演示(也没有数据库)而尝试避免使用它。
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
相关资源
最近更新 更多