Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用对象或特性创建视图模型_C#_Asp.net Mvc - Fatal编程技术网

C# 使用对象或特性创建视图模型

C# 使用对象或特性创建视图模型,c#,asp.net-mvc,C#,Asp.net Mvc,我正在创建我的第一个MVC项目,并且很好奇哪种方法是向视图模型公开代码优先实体类的正确方法。我有这样一个实体类: public class Product { public int Id { get; set; } public int CategoryId { get; set; } [StringLength(50)] public string ProductName { get; set; } public Nullable<System.D

我正在创建我的第一个MVC项目,并且很好奇哪种方法是向视图模型公开代码优先实体类的正确方法。我有这样一个实体类:

public class Product
{
    public int Id { get; set; }
    public int CategoryId { get; set; }
    [StringLength(50)]
    public string ProductName { get; set; }
    public Nullable<System.DateTime> DateAdded { get; set; }
    [StringLength(50)]
    public string AddedBy { get; set; }
}

最好选择第二个选项。将数据库类用作模型通常是不好的做法。您的第一个选项本质上就是这样做的,只是它将它包装在另一个无意义的类中

但是我要做的是,让它们都实现一个接口,这样如果您想要更改它,只需更改接口,那么两个实例都可以更改

public class ProductViewModel : IProduct
{
    public int Id { get; set; }
    public int CategoryId { get; set; }
    [StringLength(50)]
    public string ProductName { get; set; }
    public DateTime DateAdded { get; set; }
    [StringLength(50)]
    public string AddedBy { get; set; }
}

我肯定会选择第二种选择。它提供了与域模型(实体)和视图模型的清晰分离。分离这些模型很重要,因为:

  • 您需要解决两种截然不同的问题
    • 您的域处理域逻辑,即管理应用程序数据所涉及的实际业务流程
    • 您的视图侧重于视图逻辑,为与数据交互提供了良好的用户界面
  • 您可以将域层和接口层的开发工作分开。您希望最小化一个层中的小更改对其他层的影响

当然,在本例中,它有点微不足道,但当您在视图中构建更多逻辑时,它将非常重要。

最好将实体类作为一个整体传入。这样,如果类发生更改,您就不必更新ViewModel中的属性。

实体框架的一个优点是能够将普通对象用作实体。这些对象可以说是理想的模型——在它们上面提供一个模型层还涉及到将实体包装在“无意义”类中…@DanJ那么DTO和表示层之间就没有分离。视图模型是DTO和表示层之间的分离。我认为我们对“模型”的定义可能有所不同。如果我想要一个由两种不同类型的数据组成的ViewModel呢。假设我想使用IPProduct接口,我想使用IComment接口返回产品信息和注释。正确的方法是将两者连接到视图模型类中,然后将其传递给视图吗?@DanJ model!=视图模型。无论如何,在实体框架的情况下不是这样。这是个糟糕的术语。数据库类和视图模型会更好,如果它们是一样的,这不是一个好主意。正如已经给出的答案所示,这不是一个建设性的问题。一种方法在客观上并不比另一种好。
public class ProductViewModel : IProduct
{
    public int Id { get; set; }
    public int CategoryId { get; set; }
    [StringLength(50)]
    public string ProductName { get; set; }
    public DateTime DateAdded { get; set; }
    [StringLength(50)]
    public string AddedBy { get; set; }
}