📅 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)