foreach() over List

本文关键字:对象 类型 识别 over List ViewBag in foreach | 更新日期: 2023-09-27 17:55:00

我得到了这个奇怪的错误,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>
}

我得到的错误信息是:类型为"Microsoft.CSharp.RuntimeBinder"的异常。RuntimeBinderException'在System.Core.dll中发生,但未在用户代码中处理

附加信息:'object'不包含'Name'的定义

编辑:对话对象

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

foreach() over List<in ViewBag将T识别为对象而不是实际类型

可以选择使用ViewData

在控制器

ViewData["Conversations"] = lConversations 

在你的视图

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

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

然而,正如前面的评论所提到的。将变量强制转换为显式类型也解决了这个问题。

ViewBag,据我所知,不是强类型的-如果您知道对象的类型,您可以尝试强制转换。(想必你会,因为你的控制器填充它)

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