2

我目前正在使用 ASP .NET MVC 3 和 - 对于数据访问 - 实体框架的代码优先方法。

我已经阅读了很多文档、博客、stackoverflow 问题等,但还没有找到以下问题的准确答案,我希望有人可以帮助我。

我有一个包含两个实体的简单(数据库)模型:项目和客户

public class Project
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Customer Customer { get; set; }
}

和...

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Rate { get; set; }
}

为了显示 - 例如 - 我创建了一个简单的 ViewModel 的客户列表:

public class ProjectListModel
{
    public List<Project> Projects { get; set; }
}

我的控制器中的代码是:

public ActionResult ProjectList()
{
    var model = new ProjectListModel()
    {
        Projects = db.Projects.OrderBy(x => x.Customer.Id).ToList<Project>()
    };
    return PartialView("_ProjectList", model);
}

所以我可以显示项目列表,甚至是对应的客户名称。

@Html.DisplayFor(modelItem => item.Name), @Html.DisplayFor(modelItem => item.Customer.Name))

这里开始我的问题;-)

我不确定在返回“数据库对象”列表时是否正确理解了 ViewModel 的概念。你会怎么做?我可以想象一个新课程:

public class SingleProjectForViewModel
{
  public string ProjectName {get;set;}
  public string CustomerName { get;set;}
}

并将我的 ViewModel 更改为:

public class ProjectListModel
{
  public List<SingleProjectForViewModel> {get;set;}
}

...但是我的控制器中的代码会变得很长,只是为了填充 ViewModel(从 DB 中获取,创建 SingleProjectForViewModel 的实例并将这个实例添加到实例化的列表中)——对于这个例子来说,这可以,但是有更大的数据类还有更复杂的视图...!?

我还阅读了有关 Auto-Mapper 的信息,但我不确定使用此工具解决此类“问题”是否“正确”。

非常感谢您阅读本文 - 以及更多的回答或任何建议!:-)

4

1 回答 1

2

您正确理解视图模型。它们旨在消除视图层与数据层的任何耦合。

您可以/应该将数据访问代码分解为辅助类和方法,以消除控制器的复杂性。这些方法将查询数据层并返回视图模型。

我没有使用过自动映射器,但这听起来肯定可以在这里提供帮助。

于 2012-05-08T23:03:21.673 回答