Ich versuche, eine Forum-Webanwendung mit ASP.NET Core MVC und Identity zu erstellen. Mein ForumPost
Modell sieht folgendermaßen aus:
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; }
}
Ich speichere den IdentityUser
hier, sodass er in der Posts-Tabelle durch einen Fremdschlüssel für die Benutzer- Id
in der Users-Tabelle ersetzt wird, wie hier erläutert. Die Create
Methode in meinem Controller sieht folgendermaßen aus:
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);
}
Wenn ich jedoch versuche, den Username
des Erstellers in der Index.cshtml
, wird dieser leer Index.cshtml
. Dies ist die verkürzte .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>
}
Mache ich hier etwas falsch Was vermisse ich? Vielen Dank!
Im ursprünglichen Beitrag habe ich angenommen (und falsch angenommen), dass das Feld User
in ForumPost
ausgefüllt wird , indem der IdentityUser
automatisch aus der Benutzertabelle mit dem dem ForumPost
zugewiesenen ForumPost
. Es war letztendlich nicht der Fall und ich brauche wirklich nicht die gesamten Benutzerdaten, nur den Benutzernamen.
Daher habe ich meinen ForumPost
Code folgendermaßen geändert:
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; }
}
Ich habe die zusätzliche UserId
- Index
UserId
gibt , so dass die folgende Index
Aktion Zugang zu ihm haben kann. Dadurch wird die Datenbank nicht geändert, da die Datenbank bereits einen Fremdschlüssel für die Benutzer-ID enthält, der auf die Tabelle "Benutzer" verweist. Hier ist die neue 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);
}
Ich habe auch ein neues PostIndexModel
Ansichtsmodell erstellt, das nur einige Dinge zeigt:
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; }
}