跟着AI学习C#之项目实践Day5

发布于:2025-06-25 ⋅ 阅读:(21) ⋅ 点赞:(0)

📅 Day 5:实现评论系统(Comment System)

✅ 今日目标:

  • 创建 Comment 模型
  • 实现用户对文章发表评论功能
  • 在文章详情页显示评论列表
  • 支持登录用户才能评论
  • 提交 Git 版本记录进度

🧱 一、创建 Comment 模型

Models/Comment.cs

using System;

namespace MyBlog.Models
{
    public class Comment
    {
        public int Id { get; set; }
        public string Content { get; set; } = string.Empty;
        public string AuthorId { get; set; } = string.Empty;
        public string? AuthorName { get; set; }
        public int PostId { get; set; }
        public Post? Post { get; set; }
        public DateTime CreatedAt { get; set; } = DateTime.Now;
    }
}

🔌 二、将 Comment 添加到 ApplicationDbContext

✅ 修改 Data/ApplicationDbContext.cs

public DbSet<Comment> Comments { get; set; }

🧪 三、创建数据库迁移并更新数据库

在 Package Manager Console 中运行:

Add-Migration AddCommentTable
Update-Database

这将在数据库中创建 Comments 表。


✏️ 四、修改文章详情页面以支持评论

我们将在 Details.cshtml 页面中添加评论展示和提交表单。

✅ 修改 Pages/Posts/Details.cshtml.cs

注入 UserManager<IdentityUser>SignInManager<IdentityUser>

private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;

public DetailsModel(ApplicationDbContext context, UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager)
    : base(context)
{
    _userManager = userManager;
    _signInManager = signInManager;
}

[BindProperty]
public Comment NewComment { get; set; } = new();

public async Task<IActionResult> OnGetAsync(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    Post = await _context.Posts
        .Include(p => p.Category)
        .Include(c => c.PostTags).ThenInclude(t => t.Tag)
        .Include(c => c.Comments)
        .FirstOrDefaultAsync(m => m.Id == id);

    if (Post == null)
    {
        return NotFound();
    }

    return Page();
}

public async Task<IActionResult> OnPostAsync(int? id)
{
    if (!ModelState.IsValid || id == null)
    {
        return await OnGetAsync(id);
    }

    if (!_signInManager.IsSignedIn(User))
    {
        ModelState.AddModelError(string.Empty, "请先登录再发表评论。");
        return await OnGetAsync(id);
    }

    var user = await _userManager.GetUserAsync(User);
    if (user == null)
    {
        return RedirectToPage("/Account/Login");
    }

    var comment = new Comment
    {
        Content = NewComment.Content,
        PostId = id.Value,
        AuthorId = user.Id,
        AuthorName = user.UserName
    };

    _context.Comments.Add(comment);
    await _context.SaveChangesAsync();

    return RedirectToPage("/Posts/Details", new { id });
}

👁️‍🗨️ 五、在文章详情页展示评论与评论表单

✅ 修改 Pages/Posts/Details.cshtml

展示评论列表:
<h4>评论</h4>
@if (Model.Post.Comments != null && Model.Post.Comments.Any())
{
    foreach (var comment in Model.Post.Comments.OrderByDescending(c => c.CreatedAt))
    {
        <div class="card mb-2">
            <div class="card-body">
                <h6 class="card-subtitle mb-2 text-muted">@comment.AuthorName · @comment.CreatedAt.ToString("yyyy-MM-dd HH:mm")</h6>
                <p class="card-text">@Html.Raw(comment.Content)</p>
            </div>
        </div>
    }
}
else
{
    <p>暂无评论。</p>
}
添加评论表单:
@if (_signInManager.IsSignedIn(User))
{
    <h5>发表评论</h5>
    <form method="post">
        <div class="form-group">
            <textarea asp-for="NewComment.Content" class="form-control" rows="3"></textarea>
            <span asp-validation-for="NewComment.Content" class="text-danger"></span>
        </div>
        <button type="submit" class="btn btn-primary mt-2">提交评论</button>
    </form>
}
else
{
    <p><a asp-page="/Account/Login">登录</a> 后可以发表评论。</p>
}

🧩 六、可选优化建议

  • 添加 Markdown 解析支持(用于评论内容)
  • 添加评论分页(如果评论较多)
  • 添加删除评论功能(仅作者或管理员可操作)

📦 七、提交 Git 版本

git add .
git commit -m "Day5: Added Comment system with login check"

📝 今日总结

今天你完成了:

✅ 创建了 Comment 模型
✅ 配置 EF Core 关联关系
✅ 在文章详情页实现了评论展示与提交功能
✅ 增加登录权限判断,防止未登录评论
✅ 提交版本控制记录


📆 明日计划(Day6)

我们将继续增强功能:

  • 实现文章搜索功能(按标题、内容、作者)
  • 使用 LINQ 查询优化
  • 添加搜索框 UI
  • 可选:使用全文搜索引擎(如 Lucene.NET / Elasticsearch)

网站公告

今日签到

点亮在社区的每一天
去签到