C# 具有许多属性的模型的ViewModel?

C# 具有许多属性的模型的ViewModel?,c#,asp.net-mvc,design-patterns,asp.net-mvc-5,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Design Patterns,Asp.net Mvc 5,Asp.net Mvc Viewmodel,我计划创建一个Asp.NETMVC应用程序,其中包含一个与其他模型有多对多关系的大型模型的编辑/创建页面。我找到了这个工具并计划使用它 在本例中,“创建”页面使用以下ViewModel public class UserProfileViewModel { public int UserProfileID { get; set; } public string Name { get; set; } public virtual ICollection<Assigne

我计划创建一个Asp.NETMVC应用程序,其中包含一个与其他模型有多对多关系的大型模型的编辑/创建页面。我找到了这个工具并计划使用它

在本例中,“创建”页面使用以下ViewModel

public class UserProfileViewModel
{
    public int UserProfileID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<AssignedCourseData> Courses { get; set; }
}
然而,在我的例子中,会有很多属性(带有数据注释),比如说50个属性。ViewModel是否应该复制所有这些属性(也包括数据注释)?(看起来很丑?)还是有更好的办法

更新 将ViewModel定义为

public class UserProfileViewModel
{
    public UserProfile UserProfile { get; set; } 
    .... // Other properties needed by the view.
}
这种方法的一个缺点是,即使视图中不需要,也会暴露模型中的所有属性。

摘自:

非常适合ViewModels的数据类型如下:

  • 主详细数据
  • 更大的数据集
  • 复杂关系数据
  • 报告和汇总数据
  • 仪表盘
  • 来自不同来源的数据
总之,是的,当视图需要很多复杂性时,可以使用ViewModel,它适合您的需要。至于使用和填充每个属性,这些属性应该由特定视图所需的内容决定。ViewModels不一定是模型/实体的一对一表示。这应该由您的视图要求决定,例如UserCourseViewModel可以聚合UserProfile和Course实体,但不一定同时聚合它们的所有属性,除非视图需要所有属性

轴概要:

ViewData和ViewBag对象为您提供了访问模型旁边的额外数据块的方法,但是对于更复杂的数据,您可以向上移动到ViewModel。另一方面,TempData专门用于处理HTTP重定向上的数据,因此请记住在使用TempData时要小心。

摘自:

非常适合ViewModels的数据类型如下:

  • 主详细数据
  • 更大的数据集
  • 复杂关系数据
  • 报告和汇总数据
  • 仪表盘
  • 来自不同来源的数据
总之,是的,当视图需要很多复杂性时,可以使用ViewModel,它适合您的需要。至于使用和填充每个属性,这些属性应该由特定视图所需的内容决定。ViewModels不一定是模型/实体的一对一表示。这应该由您的视图要求决定,例如UserCourseViewModel可以聚合UserProfile和Course实体,但不一定同时聚合它们的所有属性,除非视图需要所有属性

轴概要:

ViewData和ViewBag对象为您提供了访问模型旁边的额外数据块的方法,但是对于更复杂的数据,您可以向上移动到ViewModel。另一方面,TempData专门用于处理HTTP重定向上的数据,因此请记住在使用TempData时要小心。

摘自:

非常适合ViewModels的数据类型如下:

  • 主详细数据
  • 更大的数据集
  • 复杂关系数据
  • 报告和汇总数据
  • 仪表盘
  • 来自不同来源的数据
总之,是的,当视图需要很多复杂性时,可以使用ViewModel,它适合您的需要。至于使用和填充每个属性,这些属性应该由特定视图所需的内容决定。ViewModels不一定是模型/实体的一对一表示。这应该由您的视图要求决定,例如UserCourseViewModel可以聚合UserProfile和Course实体,但不一定同时聚合它们的所有属性,除非视图需要所有属性

轴概要:

ViewData和ViewBag对象为您提供了访问模型旁边的额外数据块的方法,但是对于更复杂的数据,您可以向上移动到ViewModel。另一方面,TempData专门用于处理HTTP重定向上的数据,因此请记住在使用TempData时要小心。

摘自:

非常适合ViewModels的数据类型如下:

  • 主详细数据
  • 更大的数据集
  • 复杂关系数据
  • 报告和汇总数据
  • 仪表盘
  • 来自不同来源的数据
总之,是的,当视图需要很多复杂性时,可以使用ViewModel,它适合您的需要。至于使用和填充每个属性,这些属性应该由特定视图所需的内容决定。ViewModels不一定是模型/实体的一对一表示。这应该由您的视图要求决定,例如UserCourseViewModel可以聚合UserProfile和Course实体,但不一定同时聚合它们的所有属性,除非视图需要所有属性

轴概要:


ViewData和ViewBag对象为您提供了访问模型旁边的额外数据块的方法,但是对于更复杂的数据,您可以向上移动到ViewModel。另一方面,TempData专门用于处理HTTP重定向上的数据,因此请记住在使用TempData时要小心。

视图模型非常简单:视图模型应该只包含视图所需的数据。也就是说,视图模型设计由(静态)视图驱动。静态,因为您可以在浏览器中通过ajax更新视图的一部分,所以您的模型包含该信息没有任何意义(除非javascript需要将其作为init值)

如何存储数据或业务层如何使用数据(如果有)不是视图模型关注的问题

已更新

最干净、最安全的方法是使用p定义视图模型
public class UserProfileViewModel
{
    public UserProfile UserProfile { get; set; } 
    .... // Other properties needed by the view.
}