我已经研究了一段时间的MVC以及this和this等类似的问题。
然而,他们没有回答我的问题。在很多MVC示例(ASP.NET MVC和JAVA MVC)中,它们通常为Model提供字段E.G(Name,Age etc),然后允许视图“读取”这些字段。但据我所知,View不应该知道Model,因为如果View没有,那么它不是(正确)封装的。
然而,图片显示View了解模型以显示正确的数据。
如果我理解正确的是,模型可以是系统的业务逻辑,而View不应该与之连接。
让我们说我的模型从数据库中获取数据,然后它仍然是我的模型,这是我的业务逻辑而不是数据库,还是我认为错了?
所以我的问题是
答案 0 :(得分:1)
View应该知道模型使用正确的数据吗? 是。视图有一个模型导入指令,供它在渲染时绑定。如果视图对它正在访问的模型一无所知,那么它如何绑定到数据。
Controllers作业是从E.G获取数据并从中创建模型,View应该使用Model数据进行显示吗? 不,控制器应该对数据层的实现一无所知。控制器唯一的工作应该是调用构建视图模型所需的服务。
什么是模型业务逻辑? (请不要使用字段来解释) 不确定确切的术语"模型业务逻辑"。模型可用于描述域模型或在本例中为View模型。业务逻辑是您对由某些服务填充的业务或域模型对象执行的操作。
我所说的处理ViewModel和业务逻辑的方式是分离域模型,例如:客户或订单在单独的dll中,并具有由服务填充的域对象。然后,您的视图模型将成为域模型对象的组合。
总而言之,控制器调用消耗数据层的服务,这些数据层在术语上返回填充的域对象。然后可以使用它们填充视图模型,然后由视图使用。
我在下面添加了一个非常简单的方法,希望能指出你正确的方向。
public class MyController
{
[HttpGet]
public ViewResult GetCustomer(int customerID)
{
var myViewModel = new CustomerViewModel();
var myService = new MyServiceLayer();
var myCustomerDetails = myService.GetCustomerDetails(customerID);
myViewModel.Customer = myCustomerDetails;
return View("CustomerDetails", myViewModel);
}
}
public class CustomerViewModel
{
public CustomerDomainObject Customer { get; set; }
}
public class CustomerDomainObject
{
public string Name {get;set;}
}
public class MyServiceLayer
{
public CustomerDomainObject GetCustomerDetails(int customerID)
{
var myCustomer = new CustomerDomainObject();
var dataLayer = new MyDataLayer();
var myCustomerData = dataLayer.GetCustomerDetails(customerID);
var myDataRow = myCustomerData.Tables[0].Rows[0];
myCustomer.Name = myDataRow["Name"].ToString();
return myCustomer;
}
}
public class MyDataLayer
{
public DataSet GetCustomerDetails(int customerID)
{
//Execute proc etc...
return new DataSet();
}
}
答案 1 :(得分:0)
在ASP.NET MVC中,您有强大的类型视图。这是一个剃刀,可以让您在构建视图时轻松访问模型属性。您将很容易注意到这一点,因为当您尝试访问@Model.Name
等属性时,IntelliSense将起作用。如果它应该是强类型,恕我直言,它只是继续你需要的东西,没有利用强类型视图。无论何时编写视图,它都会帮助您节省大量时间,而且您肯定会有更少的运行时错误。
对于'模型业务逻辑'我会说你的模型肯定会有很多逻辑,但这并不像听起来那么简单。您可能需要使用模式并拥有负责一件事的小类。
请看这个链接:https://msdn.microsoft.com/en-us/library/hh404093.aspx
答案 2 :(得分:0)
一般来说,将域模型与其视图表示完全分离是一个好主意。域模型包含整个业务逻辑,这可能非常复杂。此外,表示层通常需要极其简化的对象(只是数据结构,没有任何业务逻辑)。特定的视图技术可能会对对象施加严格的限制。除此之外,我们经常更改/聚合域对象以满足最终用户的特定需求(通过创建专门的DTO)。因此,由于表示层和域层是如此不同(域模型不应该依赖于视图),我经常将它们完全分开。这样可以创建更柔顺的设计。