我正在开发一个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?
答案 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本身可以使用您的实体,您的存储库等。但通常最好的方法是只使用您的实体(使控制器更清洁)。