如何在一个视图中显示来自两个ViewModel的数据

时间:2013-08-08 02:35:18

标签: c# .net asp.net-mvc entity-framework

我想用2个ViewModel中的数据填充View中的2个div,但是我遇到了问题。

我的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; }
}

这意味着我想在View中的一个div中显示ChatLogsNameTimeViewModel中的数据,在View中的其他div中显示来自UserProfile的数据。

这是我的ViewModel,它使用上面的两个viewModel:

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属性。

当我在视图中创建foreach循环时,我可以访问的是:

enter image description here 这意味着我根本无法访问属性以在foreach中打印它们。

我在视图中有这个:

@model IEnumerable<Chat.Models.ChatLogsUsersViewModel>

我认为我在控制器中没有做任何事情。我在模型中实现了方法getChatLog()getOnlineUsers(),它们单独工作没问题。我只是不知道如何让它们在一个视图中协同工作。

2 个答案:

答案 0 :(得分:4)

您需要更新视图的类型。

您没有将视图传递给Chat.Models.ChatLogsUsersViewModel列表,您只有一个,此模型有两个列表。

因此请将其更新为:

@model Chat.Models.ChatLogsUsersViewModel

答案 1 :(得分:2)

您的模型是针对错误模型的强类型。正如Queti所说,你的模型应该输入@model Chat.Models.ChatLogsUsersViewModel

按原样,您的模型正在尝试访问这些模型的集合。如果你这样做,你会发现:

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

然后是单个ChatLogsUsersViewModel,并且应该在您的开发环境中显示其属性。但同样,这不是你想在这里强烈输入模型的方式。

如果我没有弄错的话,这就是你要做的,你仍然可以使用for循环访问你的数据:

@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>
}