C# MVC模式>;视图模型设计模式

C# MVC模式>;视图模型设计模式,c#,asp.net-mvc,model-view-controller,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Model View Controller,Asp.net Mvc Viewmodel,如果已经回答了,我深表歉意,但我正在寻找处理以下场景的最佳实践 我有一个相当大的MVC5应用程序,它将有许多表单/页面 在这个例子中,假设我有一个像下面这样的患者类(这是一个更大类的精简版本) 我有各种各样需要填写的表格模型。其中一些是非常大的80+属性 下面是一个简化的表单模型示例 public class ExamplePatientForm { [Key] public Patient PatientID { get; set; }

如果已经回答了,我深表歉意,但我正在寻找处理以下场景的最佳实践

我有一个相当大的MVC5应用程序,它将有许多表单/页面

在这个例子中,假设我有一个像下面这样的患者类(这是一个更大类的精简版本)

我有各种各样需要填写的表格模型。其中一些是非常大的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; }


    }
实际上,patient类和individual form类都要大得多

起初,我使用html.HiddenFor在各个表单中保存Patient类的详细信息,尽管这感觉不太对

然后我创建了ViewModels(见下文)

ViewModels删除了关系并将PatientID存储为整数。然后,我将其映射回控制器中的实体模型

虽然必须复制每个表单模型来创建视图模型对我来说似乎是一个疯狂的过程,尤其是当一些表单包含80多个属性时

有人知道最好的方法吗?我将有大约50个独特的形式

此外,我还为患者模型创建了一个编辑器模板,以便可以在每个表单的顶部显示一些患者信息。但只需要显示某些属性,因此不确定是否需要为此创建单独的PatientViewModel,或者只是隐藏其他元素

希望这是有意义的。 任何帮助都将不胜感激

问候,,
Rob

实际上,没有一个表单可能同时使用所有80个属性。如果是的话,我认为表单应该分为多个屏幕


话虽如此,ViewModel/InputModel方法无疑是最佳实践。它允许您拥有所有患者属性以及所需的任何补充信息,例如下拉菜单的项目列表。您可以使用Automapper之类的工具为您进行映射,也可以手动进行映射,具体取决于ViewModel和域模型的匹配程度。我通常只是直接在ViewModel中选择实体框架。

实际上,没有一个表单可能同时使用所有80个属性。如果是的话,我认为表单应该分为多个屏幕


话虽如此,ViewModel/InputModel方法无疑是最佳实践。它允许您拥有所有患者属性以及所需的任何补充信息,例如下拉菜单的项目列表。您可以使用Automapper之类的工具为您进行映射,也可以手动进行映射,具体取决于ViewModel和域模型的匹配程度。我通常只是直接在我的视图模型中选择实体框架。

我强烈建议不要使用您的模型(实体)作为视图模型,因为这些模型直接连接到您的ORM,例如通过实体框架。这可能意味着,如果有人足够狡猾,他们可以更新他们可能无权访问的属性(尽管是POST或GET请求)。您的域模型也应该非常精简,属性尽可能少-无
DisplayName(…)
等等

如果视图模型非常大,则应将其拆分,并将其作为较小视图模型上的属性重新使用。甚至可能创建一个工厂来建造它们


如果需要映射它们,像AutoMapper这样的一对一工具可能很方便,但我建议手动或使用简单的自制映射器进行映射

我强烈建议不要使用您的模型(实体)作为视图模型,因为这些模型直接连接到您的ORM,例如通过实体框架。这可能意味着,如果有人足够狡猾,他们可以更新他们可能无权访问的属性(尽管是POST或GET请求)。您的域模型也应该非常精简,属性尽可能少-无
DisplayName(…)
等等

如果视图模型非常大,则应将其拆分,并将其作为较小视图模型上的属性重新使用。甚至可能创建一个工厂来建造它们


如果需要映射它们,像AutoMapper这样的一对一工具可能很方便,但我建议手动或使用简单的自制映射器进行映射

使用
viewmodel
显然是最好的方法,您必须在
viewmodel
中添加所有这80多个属性。您不应该直接使用
域模型中的属性

<>你的问题似乎是<>代码> UI设计<代码>问题,而不是<代码>编程设计>代码>,所以试着考虑其他代码所建议的更改<代码> UI设计< /代码>。你当然可以把表格分成不同的表格

还可以查看这两个链接,希望它们对您的关注有所帮助


使用
viewmodel
显然是最好的方法,您必须在
viewmodel
中添加所有这80多个属性。您不应该直接使用
域模型中的属性

<>你的问题似乎是<>代码> UI设计<代码>问题,而不是<代码>编程设计>代码>,所以试着考虑其他代码所建议的更改<代码> UI设计< /代码>。你当然可以把表格分成不同的表格

还可以查看这两个链接,希望它们对您的关注有所帮助


您可以做的一件事是将非常大的模型划分为小视图模型,然后使用向导创建/更新患者。要显示信息,您可以使用选项卡-在顶部显示常用信息,在选项卡中显示其他信息。-每个选项卡都可以使用Ajax加载自己的视图模型数据。您可以做的一件事是将非常大的模型划分为小的视图模型,然后使用向导来加载数据
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; }


    }
        [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; }


    }