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テーブルでは、 ここで説明するように、Usersテーブルのユーザー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);
}
しかし、作成者の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>
}
ここで何か悪いことをしていますか?何が欠けていますか?ありがとう!
オリジナルのポストでは、私が仮定(と間違った仮定) 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
アクションがそれにアクセスできるようにしました。データベースには、Usersテーブルを指すユーザー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; }
}