c# - 为由多个数据库表组成的 View 创建 ViewModel (MVC 4)

标签 c# asp.net-mvc wpf asp.net-mvc-4 mvvm

假设我有三个数据库表:Zoo、Animal 和 ZooAnimal,它们看起来像这样:

// Zoo //
int ID
string Name

// Animal //
int ID
string Name
string Genus
string Species

// ZooAnimal //
int ID
int ZooID
int AnimalID

我想创建一个 View ,显示包含每个动物园中存在的动物的表格,如下所示:

+------------+--------+----------+-----------+
| Zoo        | Animal | Genus    | Species   |
+============+========+==========+===========+
| Oregon Zoo | Lion   | Panthera | P. leo    |
+------------+--------+----------+-----------+
| Oregon Zoo | Tiger  | Panthera | P. tigris |
+------------+--------+----------+-----------+

如果这只是一张表,那就很简单了。一个带有 EditorFor 或 DisplayFor 的 ViewModel。但由于 ViewModel 中显示的数据跨越多个连接在一起的表,我该如何组织它?

到目前为止,我已经研究过拥有单独的 ViewModel 和 DomainModel 类。三个域模型类(用于 Zoo、Animal 和 Animal Zoo)和一个 ViewModel 类(用于“AnimalsByZoo” View )。

// AnimalInZoo ViewModel //
string Zoo
string Animal
string Genus
string Species 

我的 DomainModel 类将由 DbContext 填充,但如何使用存储在 DomainModel 中的值填充我的 ViewModel 数据?我的 ViewModel 是否需要每个 DomainModel 一个字段?

// AnimalInZoo ViewModel //
[same fields as above]
Zoo ZooDomainModel
Animal AnimalDomainModel
ZooAnimal ZooAnimalDomainModel

这看起来很合理,但这是否违反了 ViewModel 只包含要在屏幕上显示的元素的想法?

最佳答案

ViewModel 用于表示 View 工作所需的数据。您拥有用户创建/编辑/删除或仅显示所需的属性。您还将通过添加DataAttributes来定义这些属性的规则,以便您可以执行 model validation 。您永远不应该将域模型返回到您的 View 中。

您可以使用一个包含每个域模型所需的所有属性的模型,从而创建一个ViewModel。如果所有这些属性都是简单属性,并且您需要填写所有这些属性来创建 AnimalsByZoo,那么这可能是正确的选择。如果您需要它只是显示数据,这也应该足够了。 如Gabriel说,你可以使用 AutoMapper在 DM 和 VM 之间来回映射。

AnimalsByZooVM animalsByZoo = Mapper.Map<AnimalsByZooVM>(dbData);

但是,如果您的 View 稍微复杂一点,或者您觉得由于某种原因需要将其拆分,则可以创建 3 个虚拟机。使用 3 个虚拟机代表 2 个表的功能非常强大,因为您可以拥有一个 AnimalVM 和一个 ZooVM。然后,您创建一个 AnimalZooVM 来保存其他两个 ViewModel,甚至是您因某种原因需要显示或保留的其他属性。

public class AnimalZooVM
{
    public ICollection<AnimalVM> Animals { get;set; }
    public ICollection<ZooVM> Zoos { get;set; }
    public int ZooAnimalId { get;set; }
}

如果您有这样的 ViewModel,则可以使用 AutoMapper 以这种方式将 DM 映射到 VM

AnimalZooVM vm = new AnimalZooVM();
vm.Animals = Mapper.Map<AnimalVM>(dbData);
vm.Zoos = Mapper.Map<ZoosVM>(dbData);

关于c# - 为由多个数据库表组成的 View 创建 ViewModel (MVC 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29497418/

相关文章:

c# - WebBrowser Control .NET - 与此控件交互的预期方式是什么?

C# Winforms Bind ListBox to DataTable问题

c# - 授权 header 需要 'Credential'参数

jquery属性控制和按钮点击

asp.net-mvc - 直接nuget在哪里放置文件

asp.net - 身份框架 - 如何通过 UserID 加入另一个配置文件表

javascript - 通过 POST ajax 调用下载文件

c# - WPF 数据绑定(bind)架构问题

C# - Process.Start ClickOnce 应用程序?什么网址?

c# - 富文本框属性问题