0

У меня есть ASP.NET MVC3 в C# и Razor. Архитектура приложения разделена на уровень доступа к данным (классы EF + репозиторий), уровень обслуживания, контроллер, ViewModels и вид.В приложении ASP.NET MVC3 ViewModel заполняется служебным слоем или контроллером?

Мой ViewModel предоставляет метод Fill, который принимает в качестве параметра сбора данных для отображения в View. Для того чтобы не иметь связи между компонентами, необходимо позвонить из сервисного уровня или из Контроллер?

ответ

2

Определение: Модель (как в MVC) = Сервис слой (в данном случае)

Контроллер должен быть сговорились как клей между видом и моделью. Представление не должно знать модель и наоборот.

Таким образом, ответ на ваш вопрос заключается в том, что контроллер должен содержать всю логику, используемую для перемещения информации от модели к модели представления. Совершенно нормально использовать любой класс из Модели в модели представления.

Обновление в ответ на комментарии

Как я уже сказал. Я понятия не имею, как выглядят ваши классы или что вам нужно сделать для создания навигации.

  1. Контроллер должен использоваться, чтобы собрать информацию, необходимую для модели представления
  2. Контроллер не должен иметь каких-либо бизнес-логики

Это означает, что вы, возможно, придется создавать новые классы в службе чтобы достичь этих двух целей.

+0

спасибо за ваш ответ. Как я писал в ответе на ответ выше, если я использую свойства навигации в ViewModel, я создаю связь между ViewModel и EF. Я хочу знать, где извлечь это значение, чтобы не создавать связь – CiccioMiami

+0

с именем 'INavigationService' в сервисном слое, который используется для заполнения модели представления. – jgauffin

+0

в соответствии с вашим ответом, поэтому это должен быть сервисный уровень, заполняющий viewmodel, а не контроллер? – CiccioMiami

1

Было бы лучше удалить функцию Fill из ViewModel, тогда ViewModel не зависела бы от вашего уровня данных.

Я бы использовал что-то вроде Automapper в контроллере, чтобы сопоставить DataObject с ViewModel перед возвратом представления.

ActionMethod:

public ActionResult Edit(int id) 
{ 
    var data = DataRepo.Get(id); 
    var viewMode = Mapper.Map<ViewModel>(data); 
    return View(viewModel); 
} 
+0

спасибо. Моя ситуация немного другая. Предположим, у меня есть объект с свойствами навигации, и я хочу получить дольку другой таблицы, используя свойство навигации. Как вы подходите к проблеме? – CiccioMiami

+0

Сопоставляете ли вы отображение двух таблиц на один ViewModel? –

+0

Чтобы быть коротким, в моем классе Продукт У меня есть несколько полей и поле CategoryId для внешнего ключа. В моей модели ViewModel у меня есть все поля Product plus CategoryName. Это означает, что для получения CategoryName я должен использовать свойство навигации из Product to Category. Если я использую его в ViewModel, я создаю связь между последним и EF – CiccioMiami