我正在嘗試使用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; }
}