2013-08-08 2 views
0

Я хотел бы заполнить 2 divs в представлении с данными из 2 ViewModels, но у меня есть проблема.Как показать данные из двух ViewModels в одном представлении

Мои 2 ViewModels:

public class ChatLogsNameTimeViewModel 
{ 
    public UserProfile UserProfile { get; set; } 

    public string Message { get; set; } 

    public DateTime Time { get; set; } 
} 

public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 

    public string UserName { get; set; } 

    public string Email { get; set; } 

    public bool IsOnline { get; set; } 

    public virtual ICollection<ChatLogs> ChatLogs { get; set; } 
} 

означает, что я хочу показать данные ChatLogsNameTimeViewModel в одном DIV в поле зрения и данных от UserProfile в другой DIV в поле зрения.

Это мой ViewModel, который использует оба ViewModels выше:

public class ChatLogsUsersViewModel 
{ 
    public IEnumerable<ChatLogsNameTimeViewModel> ChatLogs { get; set; } 

    public IEnumerable<UserProfile> Users { get; set; } 
} 

И это мой Index() действия в контроллере:

var chatLogs = db.getChatLog().ToList(); 
var users = dba.getOnlineUsers().ToList(); 

var view = new ChatLogsUsersViewModel(chatLogs, users); 
return View(view); 

Моя проблема заключается в том, что я не могу получить доступ к атрибутам ViewModel вообще.

Когда я создаю цикл Еогеаспа ввиду все, что я могу получить доступ к такому:

enter image description here означает, что я не могу получить доступ атрибутов на все, чтобы напечатать их в Еогеаспе.

Я имею это в виду:

@model IEnumerable<Chat.Models.ChatLogsUsersViewModel> 

Я предполагаю, что я не делаю что-то прямо в мой контроллер. У меня есть методы getChatLog() и getOnlineUsers(), реализованные в модели, они работают без проблем. Я просто не знаю, как заставить их работать вместе в одном представлении.

ответ

4

Вам необходимо обновить вид вашего вида.

Вы не передаёте просмотрите список Chat.Models.ChatLogsUsersViewModel, у вас его будет всего одна, и эта модель имеет два списка.

Так обновить его:

@model Chat.Models.ChatLogsUsersViewModel 
+0

Если я сделать это я не могу Foreach путем сбора .. –

+0

Вы должны иметь доступ к списку, используя Model._chatLogs и Model._users –

+0

, вы правы. спасибо –

2

Ваша модель сильно типизированных к неправильной модели. Как сказал Кетти, ваша модель должна быть напечатана @model Chat.Models.ChatLogsUsersViewModel.

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

@for each (var x in Model) { 
    x. 
} 

х тогда один ChatLogsUsersViewModel и должен показывать свои свойства в среде Dev. Но опять же, это не то, как вы хотите сильно напечатать свою модель здесь.

Если я не ошибаюсь, это то, что вы пытаетесь сделать, и вы можете получить доступ к данным, используя для каждого цикла:

@model Chat.Models.ChatLogsUsersViewModel 

for each (var log in Model._chatLogs) { 
    @<div>@log.Message</div> 
} 
... 
for each (var user in Model._users) { 
    @<div>@user.UserName</div> 
} 
+0

Я не могу использовать foreach loop, если я не использую IEnumerable в качестве вида. Что вы подразумеваете под «это не то, как вы хотите сильно набирать вашу модель здесь».? Можете ли вы подробно рассказать;) –

+0

Вы можете использовать цикл foreach в любой коллекции IEnumerable. ViewModel не должен быть IEnumerable.В вашем случае вы можете сделать цикл foreach через каждую из двух коллекций в модели представления, которую мы предлагаем. –

+0

Я пересмотрел свой ответ, используя для каждого цикла, это то, что вы пытаетесь сделать? – ElliotSchmelliot

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