首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVC,是领域的M模型还是受限和准备好的数据?

MVC,是领域的M模型还是受限和准备好的数据?
EN

Stack Overflow用户
提问于 2013-09-05 05:53:29
回答 4查看 343关注 0票数 4

我正在开发一个MVC web应用程序。我只是想知道M,域模型或poco类,或者它是经过精炼和处理的数据,准备发送到视图显示?

例如,考虑一个数据库表:

代码语言:javascript
运行
复制
Id, Name, Salary

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

代码语言:javascript
运行
复制
Id, Name, Salary, Annual Salary (Salary * 12)

根据模式指南,我会混淆我的模型类中的什么,我会在Controller中执行AnnualSalary=Salary*12并将所有4条数据传递给视图,还是我的模型将返回4列?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-05 06:52:30

ASP.NET MVC的一个很好的实践是将模型与数据库和视图模型分开。对于您的情况,我们将有两个模型: EmployeeDTO和Employee。

代码语言:javascript
运行
复制
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 (创建/更新操作)。例如,读取方法:

代码语言:javascript
运行
复制
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);
}

有了这种批准,您就可以为DataAnnotations为EmployeeDTO实现它不会自动应用于员工(因此适用于您的视图),反之亦然。在这种情况下,可以添加不影响数据库架构的新属性。

希望能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2013-09-05 06:21:00

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

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

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

当您有几十个不同的值要传递到视图时,允许您快速添加新条目或重命名现有条目的灵活性成为您最大的敌人.You,这将留给您自己来跟踪项名和值;您没有得到和编译器的帮助。是处理软件复杂性的唯一行之有效的方法,就是通过适当的设计。因此,为每个视图定义对象模型可以帮助您跟踪该视图真正需要的内容。我建议您为添加到应用程序的每个视图定义一个视图模型类。

--迪诺·埃斯波西托的“编程微软ASP.NET MVC”

更新:

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

票数 1
EN

Stack Overflow用户

发布于 2013-09-05 08:10:18

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

让域逻辑泄漏到控制器中对我来说很危险。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18628728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档