首页 > 解决方案 > 如何修复我的模型返回带有空参数的列表?

问题描述

我正在尝试创建一个简单的博客,用户可以在其中注册帐户并创建博客文章。我使用的是内置的单用户帐户系统,但已将其扩展为“ApplicationUser”,其中包含两个字段:List 和 List。我还没有实现评论,我首先致力于添加和显示帖子。

我能够成功创建帖子和用户,但是当尝试显示系统中的所有帖子时,海报字段为空。Post 类的架构是:{ID, Title, Body, Poster, TimePosted, Comments}。我在我的代码中放置了一个断点,Poster(ApplicationUser)显示为空。

我想要实现的是显示: [博客标题] by [Username] at [Date]

我遍历模型中的每个项目,它会正确打印所有内容,但以下行除外:

@Html.DisplayFor(modelItem => item.Poster.UserName)

显示一个空字符串。

我已经使用 SQL Server 对象资源管理器查看数据库中的数据,并且正确存储了用户和帖子。创建帖子的用户 ID 显示正确的 ID。说明外键设置正确。

岗位类别:

namespace BlogApp.Models
{
    public class Post
    {

        [Required, Key]
        public int ID { get; set; }

        [Required]
        public string Title { get; set; }

        [Required]
        public string Body { get; set; }

        [Required]
        public virtual ApplicationUser Poster { get; set; }

        [Required]
        public DateTime TimePosted { get; set; }

        [Required]
        public List<Comment> Comments { get; set; }

    }
}

PostsController 的 Index.cshtml 视图:

@foreach (var item in Model.Reverse())
{
    <div class="post">
        <a asp-action="Details" asp-route-id="@item.ID">
            <h3>"@Html.DisplayFor(modelItem => item.Title)", by 
@Html.DisplayFor(modelItem => item.Poster.UserName) on 
@Html.DisplayFor(modelItem => item.TimePosted)</h3>
        </a>
        <p>@Html.DisplayFor(modelItem => item.Body)</p>
    </div>
}

在此示例中,除 item.Poster.UserName 之外的所有内容均正确显示。整个Poster 对象为空,并且没有一个Poster/ApplicationUser 的属性是可访问的。

PostsController 的 Index() 方法:

public async Task<IActionResult> Index()
{
    return View(await _context.Post.ToListAsync());
}

我尝试通过首先将 ToListAsync() 的结果分配给“var list”,然后返回 View(list) 来分离这个逻辑。使用断点时,我发现列表变量中的 Poster 对象为空。

问题是没有将海报对象正确传递给视图。但是,我无法找到解决方案。

标签: c#asp.net-mvcentity-framework

解决方案


您是否尝试过使用Eager LoadingInclude

await _context.Post.Include(p => p.Poster).ToListAsync();

推荐阅读