1

是否有一个很好的设计模式来解决应用场景,当一个现有的项目集合,显示在一个“ListItem”视图中,需要添加一个新项目,进入另一个“NewItem”视图?

例如,一个带有 EF4.1 Code First 的 ASP.NET MVC3 应用程序管理一个产品列表,每个产品都包含一个部件列表。EF 模型包括具有几个基本类型属性的 Product 对象和 Part 对象的集合。

用户可以将新产品添加到列表中,打开 NewProductView 并输入一般产品信息,然后输入该新产品的部件集合。零件信息收集在另一个新零件视图中,需要包含在新产品的现有零件集合中。主要挑战是,在 NewProduct 视图和 NewPart 视图之间来回切换时,持久保存此 Parts 临时集合的最佳实践是什么?

一种选择是将新的 Part 记录立即保存到数据库中,但尚未构建父 Product 对象,并且需要多次数据库调用。理想情况下,应在一次调用中保存完整的新产品对象及其部件集合。另一种选择是将会话用于临时部件集合存储,但我确信这是否是一个好方法。目前我对不使用 Ajax 或其他客户端站点技术的设计模式很感兴趣,只是从视图中获取/发布到服务器的标准获取/发布。

4

1 回答 1

0

“理想情况下,应该在一次调用中保存完整的新产品对象及其部件集合。” 就我个人而言,我会使用 ajax 来做到这一点,当与 Steve Sanderson 的BeginCollectionItem和 jquery UI 对话框结合使用时,这完全有可能而且并不困难。但是,要在不使用 ajax 的情况下完成此操作,您可以执行以下操作:

用户从产品表单开始。在产品表单上,有一个(空的)当前部件列表以及一个新部件按钮。

当用户单击 New Part 按钮时,向操作方法提交完整的回发(因此 New Part 按钮类似于<input type="submit" name="TakeAction" value="New Part" />.

action 方法检查请求以确定单击了哪个按钮。如果单击 New Part 按钮,则操作方法将返回 Part 表单视图。

但是,Part 表单视图应该为所有可以在 Product 表单中输入的标量字段隐藏字段。此外,它会有一个这样的提交按钮:<input type="submit" name="TakeAction" value="Add Part" />

当您提交 Part 表单时,action 方法将返回 Product 表单视图。但是,当前零件列表现在包含已添加的零件,以及在先前零件表单中输入的该零件的所有标量的隐藏字段。(有关在 MVC2+ 中通过 HTTP POST 提交项目列表的更多信息,请参阅此链接此链接。)

这本质上就是 viewstate 在 web 表单中所做的,以跨多个用户点击来维护状态。在幕后,以前表单提交的所有数据都通过一系列回发而不使用会话或持久存储。在 MVC 中,由于没有视图状态,因此您必须更加明确并实际写出“其他表单的”隐藏字段,以便通过一系列回发将它们从一个表单视图传递到另一个表单视图。

但是,一旦您的产品表单获得更多“集合”属性,这很快就会失控。

您可以做的另一件事是强制用户进入渐进式披露/类似向导的工作流程以创建产品和部件。您可以要求用户首先输入所有必需的产品信息。然后,当保存该产品时,将它们推送到另一个屏幕以循环将新部件添加到产品中。这使您摆脱了相互依赖的主体和依赖表单视图的纠结,这些视图相互推送数据。

于 2012-04-09T21:47:11.627 回答