MVC模型>查看模型设计模式
本文关键字:模型 设计模式 MVC | 更新日期: 2023-09-27 18:12:48
如果这个问题已经得到了回答,我很抱歉,但是我正在寻找处理以下场景的最佳实践。
我有一个相当大的MVC5应用程序,它将有许多表单/页面。
对于这个例子,假设我有一个像下面这样的病人类(这是一个更大的类的简化版本)
Public Class Patient {
[Display(Name = "Patient Trial Number")]
public int ID { get; set; }
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Display(Name = "Patient DOB")]
public DateTime PatientDOB { get; set; }
[Required]
[Display(Name = "Patient Gender")]
public Gender PatientGender { get; set; }
}
我有各种模型的每个形式,需要完成。其中一些是非常大的80+属性。
下面是一个简单的表单模型示例:
public class ExamplePatientForm
{
[Key]
public Patient PatientID { get; set; }
[Required]
[Display(Name = "Was Sample One taken?")]
public bool? SampleOneTaken{ get; set; }
[Required]
[Display(Name = "Date Sample One Taken")]
public DateTime DateSampleOneTaken { get; set; }
[Required]
[Display(Name = "Was Sample Two taken?")]
public bool? SampleTwoTaken{ get; set; }
[Required]
[Display(Name = "Date Sample Two Taken")]
public DateTime DateSampleTwoTaken { get; set; }
public int PatientRating {get;set;}
public string Comments { get; set; }
}
实际上,患者类和个体表单类都要大得多。
最初我使用html。用于在单个表单中保存Patient类的详细信息,尽管这感觉不太对。
然后我创建了ViewModels(见下文)
[Key]
public int PatientID { get; set; }
[Required]
[Display(Name = "Was Sample One taken?")]
public bool? SampleOneTaken{ get; set; }
[Required]
[Display(Name = "Date Sample One Taken")]
public DateTime DateSampleOneTaken { get; set; }
[Required]
[Display(Name = "Was Sample Two taken?")]
public bool? SampleTwoTaken{ get; set; }
[Required]
[Display(Name = "Date Sample Two Taken")]
public DateTime DateSampleTwoTaken { get; set; }
public int PatientRating {get;set;}
public string Comments { get; set; }
}
ViewModels删除了关系并将PatientID存储为Integer。然后我将其映射回控制器中的实体模型。
虽然必须复制每个表单模型来创建一个视图模型似乎是疯狂的,但对我来说,特别是一些包含80多个属性。
有谁知道解决这个问题的最好方法吗?我将有大约50种独特的形式。
我还为患者模型创建了一个编辑器模板,这样我就可以在每个表单的顶部显示一些患者信息。但是只需要显示某些属性,所以不确定我是否需要为此创建一个单独的PatientViewModel,或者只是隐藏其他元素。
希望这是有意义的。如有任何帮助,我将不胜感激。
问候,Rob
使用viewmodel
显然是最好的方法,你必须在viewmodel
中添加所有这80多个属性,你不应该直接使用domain model
的属性。
你的问题似乎是一个UI design
问题,而不是programming desing
,所以试着考虑改变你的UI design
,因为其他人建议。你当然可以把表格分成不同的形式。
也看看这两个链接,它们将有助于解决您的问题
克里斯·普拉特
Stackoverflow
我强烈建议不要使用你的模型(实体)作为你的视图模型,因为这些模型直接连接到你的ORM,例如,通过实体框架。这可能意味着,如果某人足够狡猾,他们可以更新他们可能不应该访问的属性(通过POST或GET请求)。你的领域模型也应该非常薄,尽可能少的属性——没有DisplayName(...)
之类的。
如果你的视图模型非常大,你应该把它们分开,并在较小的视图模型上重用它们作为属性。甚至可以创建一个工厂来制造它们。
如果需要一一映射,像AutoMapper这样的工具很方便,但我建议手工或使用简单的自制映射器进行映射。
实际上,没有一个表单应该同时使用所有80个属性。如果它们是,那么我认为表单应该被分解成多个屏幕。
话虽如此,ViewModel/InputModel方法绝对是最佳实践。它允许您拥有Patient的所有属性以及您需要的任何补充信息,例如下拉菜单的项目列表。你可以使用Automapper这样的工具为你做映射或者你可以手工做,这完全取决于你取决于ViewModel和Domain Model匹配的紧密程度。我通常只是直接从实体框架中选择我的ViewModel