我正在尝试创建一个简单的博客,用户可以在其中注册帐户并创建博客文章。我正在使用内置的单用户帐户系统,但已将其扩展为“ ApplicationUser”,其中包含两个字段:列表和列表。我尚未实施评论,因此我首先致力于添加和显示帖子。
我能够成功创建帖子和用户,但是当尝试显示系统中的所有帖子时,Poster字段为空。 Post类的架构为:{ID,标题,正文,海报,TimePosted,注释}。我在代码中放置了一个断点,Poster(ApplicationUser)显示为空。
我想要实现的是显示: [日期]的[用户名]的[博客标题]
我遍历模型中的每个项目,并正确打印所有内容,除了以下行:
@ 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对象为null,并且不能访问Poster / ApplicationUser的单个属性。
PostsController的Index()方法:
public async Task<IActionResult> Index()
{
return View(await _context.Post.ToListAsync());
}
我尝试通过首先将ToListAsync()的结果分配给“ var list”,然后返回View(list)来分离此逻辑。使用断点时,我发现list变量内的Poster对象为null。
问题是Poster对象未正确传递到视图。但是,我找不到解决方法。
答案 0 :(得分:2)
您使用Include
尝试过Eager Loading吗?
await _context.Post.Include(p => p.Poster).ToListAsync();