在ASP.NET Core MVC中,如何在视图中显示帖子创建者的用户名?

问题描述 投票:0回答:1

我正在尝试使用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>
}

我在这里做错什么了吗?我想念什么?谢谢!

c# asp.net-core-mvc entity-framework-core asp.net-core-identity
1个回答
0
投票

在原始帖子中,我假设(并假设错误)通过自动使用分配给用户的外键从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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.