我正在尝试使用ASP.NET Core MVC和Identity创建一个论坛Web应用程序。我的ForumPost
模型如下所示:
public class ForumPost
{
[Key]
public int PostId { get; set; }
[Required]
[MaxLength(32)]
public string PostName { get; set; }
[Required]
public string PostBody { get; set; }
[Required]
public IdentityUser User { get; set; }
}
我存储IdentityUser
这里,所以在帖子表,它是由一个外键,用户更换Id
的用户表,如解释在这里 。我的控制器中的Create
方法如下所示:
public async Task<IActionResult> Create([Bind("PostId,PostName,PostBody")] ForumPost forumPost)
{
ModelState.Clear();
var user = await _userManager.GetUserAsync(User);
forumPost.User = user;
if (TryValidateModel(forumPost))
{
_context.Add(forumPost);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(forumPost);
}
但是,当我尝试在Index.cshtml
显示创建者的Username
时,它变成空白。这是缩短的.cshtml
:
@model IEnumerable<ForumPost>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.PostName)
</td>
<td>
@Html.DisplayFor(modelItem => item.User.UserName)
</td>
</tr>
}
我在这里做错什么了吗?我想念什么?谢谢!
在原始帖子中,我假设(并假设错误)通过使用分配给ForumPost
的外键自动从Users表中获取IdentityUser
来填充ForumPost
中的User
字段。最终情况并非如此,我真的不需要整个用户详细信息,仅需要用户名。
因此,我已将ForumPost
代码更改为:
public class ForumPost
{
[Key]
public int PostId { get; set; }
[Required]
[MaxLength(32)]
public string PostName { get; set; }
[Required]
public string PostBody { get; set; }
[Required]
[ForeignKey("User")]
public string UserId { get; set; }
public IdentityUser User { get; set; }
}
我在此处添加了UserId
,以便以下Index
操作可以访问它。这样做不会更改数据库,因为数据库已经有一个指向用户表的用户ID外键。这是新的Index
操作:
public async Task<IActionResult> Index()
{
var posts = await _context.Posts.ToListAsync();
var postList = new List<PostIndexModel>();
foreach (var p in posts)
{
var userName = (from u in _context.Users
where u.Id.Equals(p.UserId)
select u.UserName).SingleOrDefault();
var post = new PostIndexModel()
{
PostId = p.PostId,
PostName = p.PostName,
UserName = userName
};
postList.Add(post);
}
return View(postList);
}
我还创建了一个新的PostIndexModel
视图模型,该模型仅显示一些内容:
public class PostIndexModel
{
public int PostId { get; set; }
[Display(Name = "Post Name")]
public string PostName { get; set; }
[Display(Name = "Post Creator")]
public string UserName { get; set; }
}