上一篇
案例学aspnet
- 行业动态
- 2025-05-13
- 7
学习ASP.NET需掌握C#基础,理解页面生命周期、状态管理,熟悉MVC/Web Forms架构,通过实战项目提升开发与部署能力
案例背景
本案例通过构建一个简单的任务管理系统(Task Manager),演示ASP.NET Core MVC的开发流程,系统功能包括任务增删改查、任务状态标记(未完成/已完成)。
开发环境准备
工具/技术 | 版本/说明 |
---|---|
开发工具 | Visual Studio 2022 |
.NET SDK | .NET 6.0+ |
数据库 | SQL Server LocalDB (轻量级) |
前端框架 | Bootstrap 5 (CDN引入) |
数据库设计
数据库表结构
字段名 | 类型 | 说明 |
---|---|---|
Id | int | 主键,自增长 |
Description | nvarchar(500) | 任务描述 |
IsCompleted | bit | 是否完成(0/1) |
CreatedAt | datetime | 创建时间 |
实体类定义 (Models/Task.cs)
public class Task { public int Id { get; set; } public string? Title { get; set; } = null!; public string? Description { get; set; } = null!; public bool IsCompleted { get; set; } public DateTime CreatedAt { get; set; } }
项目结构
/Controllers
TasksController.cs
/Views/Tasks
Index.cshtml
Create.cshtml
Edit.cshtml
Delete.cshtml
/Data
ApplicationDbContext.cs
/Models
Task.cs
核心功能实现
数据库上下文 (Data/ApplicationDbContext.cs)
public class ApplicationDbContext : DbContext { public DbSet<Task> Tasks { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) { options.UseSqlServer("Data Source=LocalDB);Initial Catalog=TaskManager;Integrated Security=True"); } }
控制器 (Controllers/TasksController.cs)
public class TasksController : Controller { private readonly ApplicationDbContext _context; public TasksController(ApplicationDbContext context) { _context = context; } // 获取任务列表 public IActionResult Index() { var tasks = _context.Tasks.ToList(); return View(tasks); } // 创建新任务 [HttpGet] public IActionResult Create() => View(); [HttpPost] public async Task<IActionResult> Create(Task task) { task.CreatedAt = DateTime.Now; _context.Tasks.Add(task); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } // 删除任务 public async Task<IActionResult> Delete(int id) { var task = await _context.Tasks.FindAsync(id); _context.Tasks.Remove(task!); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } }
视图示例 (Views/Tasks/Index.cshtml)
@model List<Task> <table class="table table-striped"> <thead> <tr> <th>标题</th> <th>状态</th> <th>操作</th> </tr> </thead> <tbody> @foreach(var task in Model) { <tr> <td>@task.Title</td> <td>@(task.IsCompleted ? "已完成" : "未完成")</td> <td> <a class="btn btn-sm btn-warning" href="@Url.Action("Edit", new {id=task.Id})">编辑</a> <a class="btn btn-sm btn-danger" href="@Url.Action("Delete", new {id=task.Id})">删除</a> </td> </tr> } </tbody> </table>
部署配置
- 发布设置:右键解决方案 -> 发布 -> 选择”文件夹”目标
- Web.config配置(生产环境):
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=PRODUCTION_SERVER;..." providerName="System.Data.SqlClient" /> </connectionStrings>
常见问题与解决方案
问题描述 | 解决方案 |
---|---|
数据库连接失败 | 检查appsettings.json 中的连接字符串,确认SQL Server服务已启动 |
POST提交出现模型验证错误 | 在实体类中添加[Required] 特性,或检查前端表单的name 属性是否匹配 |
迁移命令报错 | 运行dotnet ef migrations add InitialCreate 前需配置OnConfiguring 方法 |
问题与解答栏目
Q1:如何实现任务状态的批量更新?
A:可通过CheckBox
配合jQuery
实现批量选择,在控制器添加UpdateStatus
方法:
[HttpPost] public async Task<IActionResult> UpdateStatus(List<int> selectedIds) { var tasks = _context.Tasks.Where(t => selectedIds.Contains(t.Id)).ToList(); foreach(var task in tasks) task.IsCompleted = true; await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); }
Q2:如何防止重复提交表单?
A:使用[ValidateAntiForgeryToken]
特性:
- 在视图
<form>
标签添加@Html.AntiForgeryToken()
- 在控制器方法添加
[ValidateAntiForgeryToken]
特性:[HttpPost] [ValidateAntiForgeryToken] public IActionResult Create(Task task) { ... }