我计划创建一个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.
}
这种方式的一个缺点是它暴露了模型中的所有属性,即使在视图中不需要它。
答案 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时请务必小心。