当模型属性的数据类型与我希望在表单中显示的数据类型非常不同时,我在使用MVC的设计模式时遇到一些麻烦。我不确定逻辑应该去哪里。
意识到我不确定如何提出这个问题,我想我会将其解释为一个具体的例子。
我有一张发票表,第二张表包含InvoiceDetails。每个InvoiceDetail项目都有一个负责批准费用的所有者。给定发票有一个或多个人,最终将在所有明细行上签名,以便批准发票。该网站的建立是为了提供审批功能。
在数据库中,我存储了批准订单项的人员的员工ID。此模式为我提供了一个模型,其中包含Approved列的String属性。
但是,我希望在网站上提供一个CheckBox,供员工点击以表明他们批准该订单项。
我想我的问题是这个 - 我该如何处理?传递给View的Model具有String属性,但传递回Controller的表单值将是CheckBox类型。我看到两种可能的方式......
1)创建一个新的Model对象来表示表单字段...比如FormInvoiceDetails ...并让业务逻辑查询数据库,然后将结果转换为另一种类型。然后在提交之后,需要将表单值转换回来,以便可以更新原始的Model对象。
2)将原始的InvoiceDetails集合传递给View,并在那里创建代码,根据String属性的值创建CheckBox。我仍然不确定如何处理提交,因为我仍然需要将表单值映射回底层数据库对象。
如果不是这两种方法中的一种,也许还有第三种方式?
为了使情况更复杂(或者可能没有),我正在渲染表单以允许编辑多行(即集合)。
感谢任何人提供的任何见解。
答案 0 :(得分:2)
您需要ViewModel,例如@Justn Niessner建议。
您的控制器从数据库加载完整的模型,将所需的字段复制到ViewModel中,然后将ViewModel移到视图中进行渲染。
我使用Automapper进行从Model到ViewModel的转换。它可以自动执行所有繁琐的thingA.x = thingY.x;
代码。
Here is an additional blog post going over in detail the use of ViewModels in the Nerd Dinner sample
答案 1 :(得分:1)
我相信你要找的是ViewModel。
如果您使用的是ViewModel,则可以设计ViewModel以匹配您需要在页面上显示的确切数据。
然后使用您的控制器将您的模型中的数据填充并映射到ViewModel,然后再返回。
Nerd Dinner ASP.NET MVC Example有一些很好的使用ViewModels的例子。