0

Извините, если об этом уже был дан ответ, но я ищу наилучшую практику при работе с приведенным ниже сценарием.MVC Model> Показать шаблон модели модели

У меня довольно большое приложение 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.HiddenFor, чтобы держать детали класса 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 в виде целого числа. Затем я сопоставил это с моделью сущности в контроллере.

Хотя для дублирования каждой модели модели для создания модели просмотра мне кажется сумасшедшим, тем более что некоторые из них содержат 80+ свойств.

Кто-нибудь знает лучший способ приблизиться к этому? У меня будет около 50 уникальных форм.

Также я создал шаблон редактора для модели пациента, чтобы я мог отображать некоторую информацию о пациенте в верхней части каждой формы. Но нужно только отображать определенные свойства, поэтому не уверен, что мне нужно создать отдельный PatientViewModel для этого или просто скрыть другие элементы.

Надеюсь, что это имеет смысл. Любая помощь будет принята с благодарностью.

С уважением, Роб

+0

Одна вещь, которую вы могли бы сделать, это Разбейте Модель очень большой в небольших Просмотр моделей, а затем использовать мастер для Создать/обновить пациента. –

+0

И для отображения информации, которую вы можете использовать вкладки. Отображение общей информации в верхней и другой информации в закладках. - Каждая вкладка может иметь собственные данные загрузки модели модели с помощью Ajax. –

ответ

1

Я бы настоятельно советовал использовать ваши модели (объекты) в качестве моделей вашего представления, так как это модели, которые подключаются непосредственно к вашему ORM, например. хотя Entity Framework. Это может означать, что если кто-то достаточно подлый, они могут обновлять свойства, к которым у них может не быть доступа (хотя запросы POST или GET). Ваши модели домена также должны быть очень тонкими с максимально возможными атрибутами - нет DisplayName(...) и т. Д.

Если ваши модели данных очень большие, вы должны разделить их и использовать их как свойства на небольших моделях. Возможно, даже создать фабрику для их строительства.

Если необходимо сопоставить их, индивидуальные инструменты, такие как AutoMapper, могут быть удобными, но я бы рекомендовал сделать сопоставление вручную или с помощью простого самодельного картографа.

1

В действительности, ни одна форма не должна, вероятно, использовать все 80 свойства сразу. Если это так, я бы сказал, что форма должна быть разбита на несколько экранов.

Сказав это, подход ViewModel/InputModel определенно является лучшей практикой. Он позволяет вам иметь все свойства Patient, а также любую дополнительную информацию, которая вам нужна, например списки элементов для выпадающих меню. Вы можете использовать такой инструмент, как Automapper, чтобы сделать сопоставление для вас, или вы могли бы просто сделать это вручную, это действительно зависит от вас и зависит от того, насколько близко подходят модели ViewModel и Domain Model. Обычно я просто выбираю из Entity Framework непосредственно в свой ViewModel.

2

Использование viewmodel, безусловно, лучший подход, и вы должны добавить все эти 80+ объектов в свой viewmodel. Нельзя использовать свойства direclty из вашего domain model.

Кроме того, проблема заключается в проблеме UI design, а не в programming desing, поэтому попробуйте рассмотреть вопрос об изменении UI design, как и другие. Вы можете разделить форму на разные формы.

также взглянуть на эти две ссылки они, надеюсь, полезно для ваших проблем
Chris Pratt
Stackoverflow

Смежные вопросы