2009-08-19 98 views
2

我正在写一个MVC应用程序。需要打开同一页面的多个实例,每个实例访问数据库中的不同记录,这些记录对象还需要在页面流中传递,然后才能最终更新。使用MVC自定义模型绑定器?

什么是最好的,最正确的,acheiving这种方式 - 应/我可以创建一个链接到一个对象通过它的唯一的ID,然后在会话中创建的每个记录对象,更新他们作为我的自定义模型绑定浏览每个人的页面流,然后调用更新方法?还是有更好的方法来处理这个问题?

干杯

MH

+0

你是指“同一页面的多个实例”?他们有完全一样的网址? 你不能在URL中拥有对象的ID吗? – 2009-08-19 11:32:56

+0

“页面的多个实例”我的意思是页面需要多次打开,每个页面都加载一个不同的对象进行编辑 – 2009-08-21 08:58:34

+0

是否有可能拥有一个URL,如www.mydomain.com/EditProduct/Step1/ [ID]' ? – 2009-08-24 11:42:57

回答

2

从技术上来说,这将是可能的,但我不认为这是明智的。当您查看IModelBinder的签名时,如果您希望能够访问应用程序的其他上下文(例如,如何基于ID对对象进行脱水),您将不得不跳过与ControllerContext相关的一些环节。

这是可能的,但如此笨重,你应该考虑是否它是正确的方法。在我看来,ModelBinder的职责是将HTTP请求数据映射到强类型对象。没有什么比这更简单 - 它完全是一个映射器,试图让它做得更多就会打破单一责任原则。

这听起来像你需要一个应用程序控制器 - 基本上,一个类,编排视图和底层模型的状态。您可以在Patterns of Enterprise Application Architecture中阅读有关应用程序控制器设计模式的更多信息。

由于Web应用程序本质上是无状态的,因此您需要一个地方来存储应用程序的中间状态。无论您使用会话还是定制的持久存储,都取决于应用程序的要求和中间数据的一般复杂性。

+0

感谢您的回复 - 好吧,这很好,模型粘合剂不是我需要使用的吗? 下面是我需要做的一个粗略的想法。我将有一堆对象(包括主表记录,其他各种表格挂在它上面,其中有一些是1 <--> 1,有些则是1 <-->)。在更改提交之前,每个人都必须经历多达3个屏幕,例如,在编辑过程中。用户将同时编辑记录,因此每个用户都将在新的浏览器窗口/选项卡中从主搜索表中打开。 – 2009-08-21 09:00:06

+0

所以说我们有3个数据对象的实例,A,B和C.以及3个屏幕,1,2和3.用户可以打开A并转到屏幕1,然后3,并且更改得到更新。然后他们可以打开B并转到屏幕1,打开C并转到屏幕1,然后C-> 2。然后B-> 2。然后A-> 1,A-> 3(保存更改)。然后C-> 3(保存)。然后在B上按下取消按钮,放弃对其的更改。所以我有几个实例在我的数据对象被同一时间全部编辑的过程中,所以我需要将它们存储在它们各自的状态中,直到它们的更改被提交回数据库。 – 2009-08-21 09:01:39

+0

恐怕,你在那里迷失了我。一般来说,如果中间状态不是域模型的一部分,我不会明确地建模它的持久性。相反,我只是将中间状态序列化并将其保存在某处(自定义数据库,SQL Server会话状态或其他)。 – 2009-08-21 10:55:46