Свойства модели представления MVC 3

У меня вопрос по организации свойств в viewModel. Насколько я понимаю, модель представления должна быть максимально простой, и главное, что она должна делать, это привязывать данные к представлению.

Вопрос в том, как отличить свойства в модели представления от модели BL. Я имею в виду, например, у меня есть модель BL, например:

   public class UserDetailsModel
    { 
        public string UserName {get;set;}
        public string SomeInfo{get;set;}
        public string AnotherInfo{get;set;}
        public string Anything{get;set;}
        public string Something {get;set;}
        ...

     }

то у меня другая модель BL говорит:

 public class UserInfoModel
        { 
            public string Info1{get;set;}
            public string Info2{get;set;}
            public string Info3{get;set;}
            public string Info4{get;set;}
            public string Info5 {get;set;}
            ...

         }

Теперь вопрос в том, как лучше всего создать ViewModel, который должен иметь данные обеих моделей BL.

1) Дублировать свойства из 2 моделей и использовать привязку модели по умолчанию для передачи данных из представления в контроллер, затем создавать модели BL из ViewModels и через данные обновления репозитория? В данном случае у нас дублирование кода...

2) ViewModel должен выглядеть примерно так:

 public class UsersIdentificationViewModel 
        {
            public UsersIdentificationViewModel()
            {
                UserInfoModel = new UserInfoModel();
            }

            public UserInfoModel UsersInfo { get; set; }

            public UserDetailsModel UserDetails { get; set; }   

        }

Привязка по умолчанию в этом случае не будет работать (поправьте меня, если я ошибаюсь), и я должен написать собственное связывание модели или что-то в этом роде... Какой подход лучше для модульного тестирования или, может быть, есть другой подход?


person StringBuilder    schedule 06.11.2012    source источник
comment
Ваш вариант 2 сработает. Вложенные модели просмотра поддерживаются. Ты пробовал это?   -  person Pablo Romeo    schedule 06.11.2012
comment
попробую так, спасибо   -  person StringBuilder    schedule 07.11.2012


Ответы (1)


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

public class UsersIdentificationViewModel 
{      
    public UserDetailsModel UserDetails { get; set; }        
    public UserInfoModel UsersInfo { get; set; }

    // I added this propery so I can round up the binding process in case the properties are simple types
    public string SomeSimpleProperty { get; set; }
}

В этом случае будет работать привязка модели по умолчанию. Поскольку параметр вашего метода действия будет сложным типом UsersIdentificationViewModel, класс DefaultModelBinder с отражением получит общедоступные свойства, проверит, являются ли они простыми или сложными типами, а затем привяжется к каждому из них.

Если свойство сложного типа, процесс повторяется. Получен набор общедоступных свойств, и связующее пытается найти для них значения. Имена свойств являются вложенными. Например: чтобы установить значение для UserName, компоновщик модели будет искать вложенный элемент данных UserDetails.UserName.

Если свойства являются простыми типами, связующее будет искать в запросе элемент данных с тем же именем, что и свойство. Например: свойство SomeSimpleProperty заставит подшивку искать элемент данных SomeSimpleProperty. Я нашел это ссылка очень полезна для объяснения привязки модели.

Для модульного тестирования у вас не будет никаких проблем или различий, если вы выберете вариант 1 или 2.

person user261882    schedule 28.02.2013