我正在尝试使用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
存储在此处,因此在Posts表中,它由用户表中用户Id
的外键替换,如here所述。我的控制器中的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);
}
但是当我尝试在Username
中显示创建者的Index.cshtml
时,它变成空白。这是缩短的.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>
}
我在这里做错什么了吗?我想念什么?谢谢!
在原始帖子中,我假设(并假设错误)通过自动使用分配给用户的外键从Users表中获取User
来填充ForumPost
中的IdentityUser
字段。 ForumPost
。最终情况并非如此,我真的不需要整个用户详细信息,只需要用户名即可。
因此,我已将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; }
}