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

MVC模型>查看模型设计模式

使用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