J'essaie de créer une application Web de forum en utilisant ASP.NET Core MVC et Identity. Mon modèle ForumPost
ressemble à ceci:
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; }
}
Je stocke IdentityUser
ici, donc dans la table Posts, il est remplacé par une clé étrangère à l' Id
utilisateur dans la table Users, comme expliqué ici . La méthode Create
dans mon contrôleur ressemble à ceci:
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);
}
Mais lorsque j'essaie d'afficher le nom d' Username
du créateur dans Index.cshtml
, il apparaît vide. Voici le .cshtml
raccourci:
@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>
}
Est-ce que je fais quelque chose de mal ici? Qu'est-ce que je rate? Merci!
Dans le message d'origine, j'ai supposé (et je me suis trompé) que le champ User
du ForumPost
est rempli en saisissant automatiquement IdentityUser
de la table Users à l'aide de la clé étrangère affectée au ForumPost
. Cela n'a finalement pas été le cas, et je n'ai vraiment pas besoin de tous les détails de l'utilisateur, juste le nom d'utilisateur.
Par conséquent, j'ai changé mon code ForumPost
en ceci:
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; }
}
J'y ai ajouté l' UserId
afin que l'action Index
suivante puisse y avoir accès. Cela ne changera pas la base de données, car la base de données possède déjà une clé étrangère d'ID utilisateur pointant vers la table Utilisateurs. Voici la nouvelle action 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);
}
J'ai également créé un nouveau modèle de vue PostIndexModel
qui ne montre que quelques éléments:
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; }
}