跟着AI学习C#之项目实践Day5
📅 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)