В ASP. NET Core MVC как показать имя пользователя создателя поста? - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь создать веб-приложение на форуме, используя ASP. NET Core MVC и Identity. Моя 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 в таблице Users. Как объяснено здесь . Метод 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>
}

Я что-то здесь не так делаю? Что мне не хватает? Спасибо!

1 Ответ

0 голосов
/ 28 января 2020

В исходном посте я предположил (и предположил, что неправильно), что поле User в ForumPost заполняется автоматически , получая IdentityUser из таблицы Users с помощью внешнего ключа назначен на 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 могло иметь к нему доступ. Это не изменит базу данных, поскольку база данных уже имеет внешний ключ User Id, указывающий на таблицу Users. Вот новое действие 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; }
}
...