2013-03-12 4 views
4

Я использую MVC (в первый раз) с рамками Entity, базами данных первогоMVC - несколько моделей в целях

То, что я хочу сделать, это отображение данные из базы данных в одном представлении. Сначала я создал базу данных, затем создал модель данных Entity Data ADO.NET, основанную на базе данных, содержащей все таблицы. Затем я создал представление индекса, которое было строго типировано с моей моделью данных сущности в качестве модели.

В моем индексе у меня в верхних

@model IEnumerable<Forum6.Models.Forum> 

Это позволяет мне получить строки из таблицы «Форум» из моей базы данных. Если я пытаюсь добавить дополнительную модель я получаю сообщение об ошибке, когда я бегу:

Line 1: @model IEnumerable<Forum6.Models.Forum> 
Line 2: @model2 IEnumerable<Forum6.Models.Post> 

Parser Error Message: Only one 'model' statement is allowed in a file.

После поиска ответа я нашел это: Two models in one view in ASP MVC 3 Ответ был создать ViewModel (ParentModel), который содержал все Модели (таблицы). Это ViewModel я создал:

public class ViewModel 
{ 
    public IEnumerable<Forum6.Models.Forum>   Forum  { get; set; } 
    public IEnumerable<Forum6.Models.Post>   Post  { get; set; } 
    public IEnumerable<Forum6.Models.Topics>  Topics  { get; set; } 
    public IEnumerable<Forum6.Models.Users>   Users  { get; set; } 
    public IEnumerable<Forum6.Models.PrivMsg>  PrivMsg  { get; set; } 
    public IEnumerable<Forum6.Models.Permission> Permission { get; set; } 
} 

Я отредактировал мой контроллер выглядеть следующим образом:

public class HomeController : Controller 
{ 
    // ForumDBEntities old_db = new ForumDBEntities(); 

    ViewModel db = new ViewModel(); 

    public ActionResult Index() 
    { 
     return View(db); 
    } 
} 

Затем заменил старый вид индекса с новым сильно типизированной, который использовал ViewModel в качестве модели. Который содержит:

@model IEnumerable<Forum6.Models.ViewModel> 

Попытка запустить это дает мне эту ошибку:

The model item passed into the dictionary is of type 'Forum6.Models.ViewModel', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[Forum6.Models.ViewModel]

Как сделать "ViewModel" enumarable? Или моя ошибка в другом месте?

+0

проход ViewModel как модель на ваш взгляд: @model ViewModel – Sergio

+0

К сожалению, забыл включить то, что моя точка зрения содержит. Отредактировал мой ответ, чтобы включить. "@model IEnumerable " – NoClueBlue

+0

Судя по тому, что я вижу, вы уверены, что ваша viewmodel должна быть IEnumerable? Поскольку все элементы внутри, как и в первой попытке. –

ответ

10

Вам нужно будет изменить @model IEnumerable<Forum6.Models.ViewModel> на @model Forum6.Models.ViewModel, поскольку вы обертываете свои IEnumerables внутри одного ViewModel.

Хорошее эмпирическое правило состоит в том, чтобы иметь отношение 1: 1 между ViewModel и View. enter image description here

Это может быть хорошее чтение для вас: http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/ (просто игнорировать automapper часть, если вы не хотите идти по этому пути)

Вам также необходимо поместить в фактических данных в вашей ViewModel начиная с:

ViewModel db = new ViewModel(); 

public ActionResult Index() 
{ 
    return View(db); 
} 

просто даст вашему виду пустую ViewModel. Один из способов сделать это было бы.

public ActionResult Index() 
{ 
    var model = new ViewModel 
        { 
         Forum = db.GetForum(), 
         Post = db.GetPost(), 
         Topic = you get the idea 
        }; 

    return View(model); 
} 

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

public class ViewModel 
{ 
    public IEnumerable<Forum6.Models.Forum>   Forums  { get; set; } 
    public IEnumerable<Forum6.Models.Post>   Posts  { get; set; } 
    public IEnumerable<Forum6.Models.Topics>  Topics  { get; set; } 
    public IEnumerable<Forum6.Models.Users>   Users  { get; set; } 
    public IEnumerable<Forum6.Models.PrivMsg>  PrivMsgs { get; set; } 
    public IEnumerable<Forum6.Models.Permission> Permissions { get; set; } 
} 
+0

Я стараюсь, но методы соответствующих моделей не подвергаются воздействию. Почему так? Нужно ли мне также создавать метод в ViewModel? – Volatil3

1

Изменить @model IEnumerable<Forum6.Models.ViewModel> на @model Forum6.Models.ViewModel, поскольку вы передаете один экземпляр класса ViewModel, а не их коллекцию.

Все ваши коллекции передаются в одном экземпляре модели представления.

+0

Возможно, это должно быть наоборот? Мне нужно передать коллекцию ViewModel в представление. Если я этого не сделаю, я не смогу запустить "@foreach (элемент var в модели) {...}" – NoClueBlue

+0

Нет, этот путь правильный. Одна модель представления, которая может содержать некоторые коллекции внутри. –

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