ViewBag中的List <t>上的foreach()将T识别为对象而不是实际类型

时间:2015-06-10 09:58:21

标签: c# asp.net-mvc razor

我得到了这个奇怪的错误,Razor会说某个对象中不存在属性。我觉得我犯的是一个愚蠢的错误,但是我已经和它斗争了一段时间,但没有运气。有线索吗?

控制器方法:

List<Conversations> lConversations = usr.conversations.OrderBy(o => o.active).ThenByDescending(o => o.updated_at).ToList().Select(i => new Conversations
{
    Created = i.created_at, Creator = string.Format("{0} {1}", i.user.first_name, i.user.last_name), Name = i.name, Status = (i.active) ? "Active" : "Deactivated", TotalUsers = i.message_recipient.Count(c => c.active)
}).ToList();

ViewBag.conversations = lConversations;

在视图文件中,我尝试遍历该对象并打印出数据。

@foreach (var i in ViewBag.conversations)
{
    <tr>
        <td>@i.Name</td>
        <td>@i.TotalUsers</td>
        <td>@i.Creator</td>
        <td>@i.Status</td>
        <td>@i.Created</td>
    </tr>
}

我得到的错误消息是:类型&#39; Microsoft.CSharp.RuntimeBinder.RuntimeBinderException&#39;发生在System.Core.dll中但未在用户代码中处理

其他信息:&#39;对象&#39;不包含&#39;名称&#39;

的定义

编辑:对话对象

public class Conversations
{
    public string Name { get; set; }
    public int TotalUsers { get; set; }
    public string Creator { get; set; }
    public string Status { get; set; }
    public DateTime Created { get; set; }
}

3 个答案:

答案 0 :(得分:0)

一个选项是使用ViewData

在您的控制器中

ViewData["Conversations"] = lConversations 

在你看来

List<Conversations> lConversations = ViewData["Conversations"] as List<Conversations>;

答案 1 :(得分:0)

我发现使用ViewBag对我自己来说是不正确的方法,因为我知道我使用的数据类型是因为我设置了它们 - 我使用的是模型。

但是,正如之前评论中所述。将变量转换为显式类型也解决了问题。

答案 2 :(得分:-1)

据我所知,

ViewBag并非强类型 - 如果你知道对象的类型,你可以尝试施放。 (大概你这样做,因为你的控制器填充了它)

您也可以尝试传递强类型对象或使用ViewModel。