MVC,是M模型的域还是它被限制和准备的数据?

时间:2013-09-05 05:53:30

标签: asp.net-mvc asp.net-mvc-4 design-patterns

我正在开发一个MVC网络应用程序。我只是想知道是M,域模型还是poco类,或者它是经过精炼和处理的数据,可以发送到View进行显示了吗?

例如,考虑数据库表:

Id, Name, Salary

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

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

我根据模式指南混淆了我的Model类中的内容,我会在Controller中执行AnnualSalary=Salary*12并传递所有4个数据进行查看,否则我的模型将返回4列?

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

4 个答案:

答案 0 :(得分:1)

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

因此,建议您在Controller中计算Annual Salary,将ViewModel和ViewModel放入视图中。

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

  

当您有许多不同的值传递给视图时,您可以获得相同的灵活性   快速添加新条目,或重命名现有条目,成为你最大的敌人。你留在你的   拥有跟踪项目名称和值;你没有得到Microsoft IntelliSense和编译器的帮助。   处理软件复杂性的唯一可靠方法是通过适当的设计。因此,为每个视图定义对象模型可帮助您跟踪视图真正需要的内容。我建议你定义一个   您添加到应用程序的每个视图的视图模型类

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

<强>更新

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

答案 1 :(得分:1)

ASP.NET MVC的一个好习惯是将模型与数据库和模型分离为View。 在您的情况下,我们将有两个模型: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; } } 
}

在Controller上,您将把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);
}

通过这个approche,您可以实现EmployeeDTO的DataAnnotations,它不会自动应用于Employee(因此对于您的View),反之亦然。 在您的情况下,您可以添加一个不影响数据库架构的新属性。

希望它有所帮助。

答案 2 :(得分:1)

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

让域逻辑漏进你的控制器对我来说是冒险的。

答案 3 :(得分:0)

  

我只是想知道是M,域模型还是poco类,还是经过精炼和处理的数据,可以发送到View进行显示?

MVC模式定义不明确,M,V,C和类之间没有1-1映射。

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

该模式并不真正关心您如何获取信息,信息的组成方式或信息的结构。它只是说Controller应该从模型中获取信息并将其提供给View。

现在,ASP.NET MVC使用ViewModels,它们用作Model信息的适配器,因此适应它,以便View不必包含转换信息的逻辑。

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