当前位置:首页 > 行业动态 > 正文

案例学aspnet

学习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>

部署配置

  1. 发布设置:右键解决方案 -> 发布 -> 选择”文件夹”目标
  2. 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]特性:

  1. 在视图<form>标签添加@Html.AntiForgeryToken()
  2. 在控制器方法添加[ValidateAntiForgeryToken]特性:
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Create(Task task) { ... }
0