4

我正在开发一个 MVC Web 应用程序。我只是想知道是 M、域模型还是 poco 类,或者它是经过提炼和处理的数据准备好发送到 View 进行显示?

例如考虑一个数据库表:

Id, Name, Salary

要显示,我需要 4 列而不是 3 列:

Id, Name, Salary, Annual Salary (Salary * 12)

根据模式指南,我对模型类中的内容感到困惑,我会AnnualSalary=Salary*12在 Controller 中执行并将所有 4 条数据传递给查看,还是我的模型将返回 4 列?

另一点是,如果我需要使用这 4 列从其他表中添加地址,模型应该返回精炼和必需的数据还是在控制器中我应该查询 2 个不同的数据表并进一步选择并将数据传递给 View ?

4

4 回答 4

1

基于 MVC 模式,Controller 负责提供 View 自己制作所需的所有信息。此外,ViewModel 是一个类,它可以组合来自不同来源的视图的所有信息。

所以,建议你Annual Salary在你的Controller中计算,放入ViewModel并将ViewModel发送到view。

这是开发人员中非常有效和流行的方法。

当您有数十个不同的值要传递给视图时,允许您快速添加新条目或重命名现有条目的相同灵活性将成为您最大的敌人。您只能自己跟踪项目名称和值;您无法从 Microsoft IntelliSense 和编译器获得帮助。 处理软件复杂性的唯一行之有效的方法是通过适当的设计。因此,为每个视图定义一个对象模型有助于您跟踪该视图真正需要什么。我建议您为添加到应用程序的每个视图定义一个视图模型类

-- Dino Esposito 的“编程 Microsoft ASP.NET MVC”

更新:

我的假设是Annual SalaryViewModel 属性而不是业务属性。

于 2013-09-05T06:21:00.693 回答
1

ASP.NET MVC 的一个好的做法是将模型从数据库中分离出来,并将模型用于视图。在您的情况下,我们将有两个模型:EmployeeDTO 和 Employee。

public class EmployeeDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Salary { get; set; }
}

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Salary { get; set; }
    public int AnnualSalary { get { return this.Salary * 12; } } 
}

之后,在您的控制器上,您将 EmployeeDTO 映射到 Employee(以读取操作),并将 Employee 映射到 EmployeeDTO(以创建/更新操作)。例如,一个 Read 方法:

public ActionResult Read(int id)
{
    EmployeeDTO employeeDTO = db.Employee.Find(id);
    Employee employee = new Employee()
    {
        Id = employeeDTO.Id,
        Name = employeeDTO.Name,
        Salary = employeeDTO.Salary
    };
    return View(employee);
}

使用此方法,您可以为 EmployeeDTO 实现 DataAnnotations,它不会自动应用于 Employee(因此应用于您的视图),反之亦然。在您的情况下,您可以添加一个不影响数据库架构的新属性。

希望能帮助到你。

于 2013-09-05T06:52:30.367 回答
1

无论您如何与视图通信,年薪计算都是域逻辑,因此应该成为域模型的一部分。

让域逻辑泄漏到您的控制器中对我来说看起来很冒险。

于 2013-09-05T08:10:18.167 回答
0

我只是想知道是 M、域模型还是 poco 类,或者它是经过提炼和处理的数据准备好发送到 View 进行显示?

MVC 模式定义模糊,在 M、V、C 和类之间没有 1-1 映射。

模型是用于获取视图所需信息的一切。因此,它是您的存储库/wcf 客户端/dto/实体等。

该模式并不真正关心您如何获取信息,它包含什么或信息的结构。它只是说控制器应该从模型中获取信息并将其提供给视图。

现在,ASP.NET MVC 使用 ViewModels,它旨在用作模型信息的适配器,因此对其进行调整,以便视图不必包含转换信息的逻辑。

VM 本身可以使用您的实体、存储库等。但通常最好的方法是仅使用您的实体(以使控制器更清洁)。

于 2013-09-05T10:27:14.147 回答