与DTO相比,视图模型具有行为/方法,但是

本文关键字:方法 但是 DTO 相比 视图 模型 | 更新日期: 2023-09-27 18:01:10

SO上的人经常说:"ViewModel包含可以由视图执行的方法、指示如何切换视图元素的属性等…">

当我的ViewModel作为WebApi响应发送到序列化为JSON的客户端时,这个ViewModel如何在客户端上执行方法?

我一点也不清楚。

与DTO相比,视图模型具有行为/方法,但是

您至少可以通过两种方式理解视图模型

  • 不是将业务对象传递给视图(例如MVC Razor视图(,而是传递包含该视图所需属性的精简对象,而不传递其他内容。当视图设计器使用从数据库延迟加载的字段时,视图创建更容易,并且可以避免问题(避免选择N+1问题和其他问题(

  • 您可以创建将在客户端使用的视图模型(在Javascript中(。您在Javascript中将其创建为对象,因此它可以包含视图可以调用的方法。您所描述的(使用WebAPI发送JSON对象(只是提供给视图模型的数据。例如,您可以在主页上查看knockoutjs。您可以看到包含tickets数组的TicketsViewModel。在本例中,您可以在viewmodel中看到三种硬编码的票证。但是,您可以像您描述的那样从WebAPI中以JSON的形式获取它们。下载后,只需将它们放在这个数组中。

DTO(数据传输对象(包含可消费格式的数据。ViewModel/ActionModel包含格式化后供视图使用的数据。

DTO可能看起来像:

public class OrderDTO
{
    public decimal Price { get; set; }
    public int Amount { get; set; }
}

而ViewModel可能看起来像:

public class OrderViewModel
{
    public decimal Price { get; set; }
    public int Amount { get; set; }
    public string PriceBackgroundColor { get; set;}
    public Uri ImageUri { get; set; }
}