2016-08-30 2 views
0

Я новичок в Entity и Visual Studio. У меня есть две модели, уже заполненные данными, а третья - часть контроллера, в которой я хочу реализовать две другие модели. Я не хочу редактировать две другие модели, а просто показывать данные уже в таблице.Отображение 3 моделей в одном представлении/контроллере

Я попытался использовать кортеж, используя этот учебник Multiple models in a view , но не могу использовать операторы @foreach.

@model Tuple<App.Models.ValueForecast, App.Models.FacilityEditor, App.Models.ForecastSub> 

Самый простой способ иметь три модели в одном представлении? Остальные две модели должны иметь возможность отображать данные из своих табличных данных.

Я знаю, что есть метод с ViewModels, но данные из таблицы не отображается, я использовал этот метод: Two models in one view in ASP MVC 3 но не работает

+0

Вы не можете @foreach кортеж, но если одно из свойств кортежа реализует IEnumerable, вы можете. Это так? Какой тип перечисленных кортежей? – Will

+0

@ Видите ли, я понял, что видел это на других страницах stackoverflow, но потом, как бы я это сделал? – johndoesnow

+0

Почему у вас нет связанного ответа? Как вы реализовали это решение? – Jasen

ответ

3

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

Вам нужен DTO, когда вы передаете слишком много параметров одному методу или когда вам нужно несколько объектов в ваших представлениях (говоря о C# и веб-разработке) DTOs.

Даже в новом ядре C# и его веб-разработке многие люди рекомендуют иметь папку под названием «ViewModels», где вы можете разместить одну модель представления для каждого вида, позволяя передавать сложные объекты.

Другие ссылки уточнить: What are view models?

A view model represents the data that you want to display on your view/page, whether it be used for static text or for input values (like textboxes and dropdown lists) that can be added to the database (or edited). It is something different than your domain model. It is a model for the view.

Таким образом, вы должны создать новый класс, которые действуют как контейнер других ваших объектов, в вашем случае что-то вроде:

public class NameOfTheviewViewModel { 
    public App.Models.ValueForecast ValueForecast { get; set; } 
    public App.Models.FacilityEditor FacilityEditor { get; set; } 
    public App.Models.ForecastSub ForecastSub { get; set; } 
} 

А потом используйте этот класс в качестве модели для вашего вида:

@model NameOfTheviewViewModel 
foreach(var item in Model.ValueForecast) //Or whatever your list are 
{ 
    // do something 
} 
+0

Должен ли я использовать кортеж или продолжать использовать только «@model IEnumerable » – johndoesnow

+0

Я уже редактировал вопрос, чтобы уточнить – rekiem87

+0

@johndoesnow вам нужно создать класс для хранения ваших данных, а не кортежа. Затем вы можете использовать этот класс View Model при работе с вашими данными. – lukejkw

0

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

Обратите внимание, что сопоставление объектов вашего домена (POCOs) прямо с вашим представлением не является идеальным, так как вы часто в конечном итоге смешиваете специальный код презентации с кодом уровня доступа к данным.

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

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