MVC3(模型)......在视图上显示复杂数据的正确方法是什么?

时间:2011-03-25 20:02:15

标签: asp.net-mvc-3

我在理解如何在MVC3上使用模型时遇到了哲学问题。 我认为问题在于我来自WebForms: - )

假设我的数据库上有10个表,并且正如我将它们放入EF4中所预期的那样,我得到了表示表的Entity类(以及它们所有的FK整数值)。

当我想在View上显示数据时,我无法显示select * from table,因为那些FK整数对我的用户没有任何意义......而且因为某些数据位于相关表中。

所以我的理解是,我可以创建一个存储过程,创建一个复杂类型,表示要显示的实际数据,来自不同SQL连接的单独表。

问题1: 在视图上,id MVC兼容用作@model ..复杂类型? 或者我应该始终使用在Models文件夹中创建的模型吗?如果是这样,这是否意味着我必须在Models文件夹中的新模型上复制Complex Type?

问题2: 这是正确的方法......创建特定的SP来收集将要显示的数据,或者..使用linq和lambda应用于将数据库导入EMDX设计器的EF4类型更好。

思索? FP

2 个答案:

答案 0 :(得分:1)

正确的方法是始终定义视图模型。视图模型是专门针对给定视图的需求而定制的类,并且将在MVC应用程序层中定义。这些类只包含视图需要显示的属性。那么您需要在域模型(EF自动生成的类?)和视图模型之间进行映射。

因此,控制器操作将查询存储库以获取域模型,将其映射到视图模型并将此视图模型传递给视图。 Top可以使用AutoMapper来简化此映射。视图不应与域模型绑定,并始终与视图模型一起使用。这也是另一种方式:控制器操作从视图接收视图模型作为操作参数,将其映射到域模型并将此域模型传递到存储库以便使用它执行某些操作(CRUD)。 p>

因此,视图模型可以是从多个域模型映射的类,也可以将多个视图模型映射到单个域模型。这完全取决于您的域名的样子以及您希望如何向用户表示信息。

就验证而言,我区分了两种类型:UI验证和业务验证。作为UI验证的示例是:需要字段,或者必须以给定格式输入字段。业务验证是:用户名已被占用或资金不足以执行电汇。应该对域模型上的视图模型和业务验证进行UI验证。

答案 1 :(得分:0)

我不确定为什么需要使用存储过程,LINQ to Entities能够生成复杂类型而无需创建存储过程(在大多数情况下)。您可以选择数据子集,就像使用常规SQL一样。

正如Darin所说,使用视图模型适用于您拥有大量复杂数据但未由单个实体表示的情况。此视图模型将包含多个实体,甚至包含多个实体集合。这一切都取决于您的数据需要消耗的方式。