创建带有对象或属性的视图模型

本文关键字:视图 模型 属性 对象 创建 | 更新日期: 2023-09-27 18:06:15

我正在创建我的第一个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
{
    Product myProduct { get; set; }
}
public class ProductViewModel
{
    public int Id { get; set; }
    public int CategoryId { get; set; }
    public string ProductName { get; set; }
    public DateTime DateAdded { get; set; }
    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中的属性。

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

  • 你有两种截然不同的关注点需要解决
    • 您的域处理域逻辑,涉及管理应用程序数据的实际业务流程。
    • 你的视图专注于视图逻辑,呈现一个与数据交互的良好用户界面。
  • 您可以将域层和接口层的开发工作分开。你想要最小化一个图层的小变化对其他图层的影响。

当然,在这个例子中,它是微不足道的,但当你在视图中构建更多的逻辑时,它将非常重要。