ViewModel是否具有很多属性的模型?

时间:2014-01-18 09:42:53

标签: c# asp.net-mvc design-patterns asp.net-mvc-5 asp.net-mvc-viewmodel

我计划创建一个Asp.Net MVC应用程序,其中包含与其他模型具有多对多关系的大型模型的编辑/创建页面。我找到了Saving Many to Many relationship data on MVC Create view并计划使用它。

在示例中,创建页面使用以下ViewModel。

public class UserProfileViewModel
{
    public int UserProfileID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<AssignedCourseData> Courses { get; set; }
}

UserProfile模型只有两个属性,因此ViewModel只复制了所有属性。

public class UserProfile
{
    public UserProfile()
    {
        Courses = new List<Course>();
    }
    public int UserProfileID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

但是,在我的情况下,会有很多属性(带有数据注释),比如50个属性。 ViewModel是否应该复制所有这些属性(还有数据注释)? (看起来很难看?)还是有更好的方法?

更新 将ViewModel定义为

是一个好习惯
public class UserProfileViewModel
{
    public UserProfile UserProfile { get; set; } 
    .... // Other properties needed by the view.
}

这种方式的一个缺点是它暴露了模型中的所有属性,即使在视图中不需要它。

2 个答案:

答案 0 :(得分:2)

View Models的功能非常简单:View Model应该只包含View所需的数据。也就是说,视图模型设计由(静态)视图驱动。静态,因为您可以通过浏览器中的ajax更新视图的某些部分,因此您的模型包含该信息是没有意义的(除非它需要作为javascript的初始值)。

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

<强>更新

最干净,最安全的方法是使用您需要的属性定义视图模型(您可以从其他模型中复制粘贴它们在此方案中正常),然后使用Automapper将业务对象映射到视图模型。这样,您可以以不同方式改进两种模型。就个人而言,我的视图模型很少与商业模式完全相同,它们很像很多,但存在那些使事情变得复杂的微小差异。

从关注点分离的角度来看,teh busines模型用于业务用途,持久性模型用于持久性使用,而视图模型用于视图用法。不要混合它们,否则你会有一个模型供应太多的主人,这会带来复杂的问题。

答案 1 :(得分:1)

取自:This excellent explanation of ViewBag, ViewData and TempData

适合ViewModels的数据类型如下:

  • 主 - 详细数据
  • 更大的数据集
  • 复杂的关系数据
  • 报告和汇总数据
  • 仪表板
  • 来自不同来源的数据

总而言之,是的,ViewModel是在视图需要很多复杂性时使用的,它适合您的需求。至于使用和填充应由特定视图所需的每个属性确定的属性。 ViewModel不一定是模型/实体的一对一表示。这应该取决于您的观看要求,例如: UserCourseViewModel可以聚合UserProfile和Course实体,但不一定都是它们的所有属性,除非视图需要所有属性。

Rachels摘要:

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