MVC中的View是否应该知道模型数据?

时间:2017-03-09 12:30:10

标签: c# model-view-controller architecture

我已经研究了一段时间的MVC以及thisthis等类似的问题。

然而,他们没有回答我的问题。在很多MVC示例(ASP.NET MVC和JAVA MVC)中,它们通常为Model提供字段E.G(Name,Age etc),然后允许视图“读取”这些字段。

但据我所知,View不应该知道Model,因为如果View没有,那么它不是(正确)封装的。

然而,图片显示View了解模型以显示正确的数据。

enter image description here

如果我理解正确的是,模型可以是系统的业务逻辑,而View不应该与之连接。

让我们说我的模型从数据库中获取数据,然后它仍然是我的模型,这是我的业务逻辑而不是数据库,还是我认为错了?

所以我的问题是

  • View应该知道模型使用正确的数据吗?
  • 控制器作业是从E.G数据库中获取数据并从中创建模型,并且View应该使用模型数据进行显示吗?
  • 什么是模型业务逻辑? (请不要使用字段来解释)

3 个答案:

答案 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)。因此,由于表示层和域层是如此不同(域模型不应该依赖于视图),我经常将它们完全分开。这样可以创建更柔顺的设计。