当前位置: 首页 > news >正文

第三章 控制器和动作方法

3.1 控制器基础

控制器的定义与作用

控制器(Controller)是ASP.NET Core Web API的核心组件,负责处理HTTP请求并生成HTTP响应。在Web API中,控制器通常:

  • 继承自ControllerBase类(而非MVC应用中的Controller类)
  • 使用[ApiController]特性标记
  • 包含一个或多个动作方法(Action Methods)
  • 负责协调模型和视图(在API中是指响应数据)

创建基本控制器

以下是创建控制器的基本步骤:

  1. Controllers文件夹中创建新文件(如TodoItemsController.cs
  2. 添加以下代码:
using Microsoft.AspNetCore.Mvc;
using TodoApi.Models;namespace TodoApi.Controllers
{[Route("api/[controller]")][ApiController]public class TodoItemsController : ControllerBase{private readonly TodoContext _context;// 通过依赖注入获取数据上下文public TodoItemsController(TodoContext context){_context = context;}// 动作方法将在后续添加}
}

关键组件:

  • [Route("api/[controller]")]:定义路由模板,[controller]会被替换为控制器名称(不含"Controller"后缀)
  • [ApiController]:启用API特定行为
  • ControllerBase:包含API控制器所需的基本功能
  • 依赖注入:通过构造函数注入TodoContext

3.2 Action Methods(动作方法)

动作方法简介

动作方法(Action Methods)是控制器中处理特定HTTP请求的公共方法。它们:

  • 映射到特定的HTTP方法(GET, POST, PUT, DELETE等)
  • 返回数据或IActionResult派生类型
  • 可以接收来自请求的参数
  • 执行业务逻辑或调用服务

HTTP动词属性

ASP.NET Core使用特性(Attributes)将HTTP动词映射到动作方法:

HTTP动词特性 对应HTTP方法 典型用途
[HttpGet] GET 获取资源
[HttpPost] POST 创建资源
[HttpPut] PUT 更新资源
[HttpDelete] DELETE 删除资源
[HttpPatch] PATCH 部分更新

例如,添加获取所有待办事项的GET方法:

// GET: api/TodoItems
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{return await _context.TodoItems.ToListAsync();
}

3.3 实现CRUD操作

以下是待办事项API的完整CRUD实现:

获取所有项目(Read All)

// GET: api/TodoItems
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{return await _context.TodoItems.ToListAsync();
}

获取特定项目(Read One)

// GET: api/TodoItems/5
[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{var todoItem = await _context.TodoItems.FindAsync(id);if (todoItem == null){return NotFound();}return todoItem;
}

创建新项目(Create)

// POST: api/TodoItems
[HttpPost]
public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todoItem)
{_context.TodoItems.Add(todoItem);await _context.SaveChangesAsync();return CreatedAtAction(nameof(GetTodoItem),new { id = todoItem.Id },todoItem);
}

更新项目(Update)

// PUT: api/TodoItems/5
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(long id, TodoItem todoItem)
{if (id != todoItem.Id){return BadRequest();}_context.Entry(todoItem).State = EntityState.Modified;try{await _context.SaveChangesAsync();}catch (DbUpdateConcurrencyException){if (!TodoItemExists(id)){return NotFound();}else{throw;}}return NoContent();
}private bool TodoItemExists(long id)
{return _context.TodoItems.Any(e => e.Id == id);
}

删除项目(Delete)

// DELETE: api/TodoItems/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteTodoItem(long id)
{var todoItem = await _context.TodoItems.FindAsync(id);if (todoItem == null){return NotFound();}_context.TodoItems.Remove(todoItem);await _context.SaveChangesAsync();return NoContent();
}

wechat_2025-07-31_105805_938


http://www.sczhlp.com/news/3009/

相关文章:

  • 2
  • 深入解析:2025年自动化工程与计算机网络国际会议(ICAECN 2025)
  • LangChain 架构入门指南
  • 2025.8.1 贪心
  • vue3中的watch详细讲解保证看的明明白白
  • thinkphp6.0 项目,使用原生session 很正常,但是使用think 的 session 不正常,在本类中存储,本类中读取可以,其他类中读取 是空值是怎么回事
  • AI 时代,为什么我们还有必要写博客?
  • 阿里云OSS对象存储简单上手(超级详细,针对小白)
  • 一种CAN接口电路的隔离方案
  • 热卷 2510
  • P5405 [CTS2019] 氪金手游 题解
  • 阿里云OSS对象存储简单使用(超级详细,针对小白上手!!)_阿里云oss使用教程-CSDN博客-2025-08-01 08_06_12
  • 浅谈后缀自动机
  • 多Agent协作入门:移交编排模式
  • Oxygen Forensic Detective 17.3.1 新增功能简介 - 一体化数字取证软件
  • ARM物联网漏洞利用实验室在Blackhat USA 2017首次亮相
  • 谁在给字节赚钱:⌈巨量⌋一出,谁与争锋?
  • 大模型时代,这才是AI的“隐形心脏”
  • nodejs第一天
  • 题解 P8883 幻想中成为原神
  • 薄膜铌酸锂量子光子学:回顾与展望
  • 一步一步学习使用LiveBindings(1) 使用向导无代码创建基于绑定的FireMonkey应用程序
  • 近几年常见的一类二分套路题,从上古时代 01 规划的基础原理扩展
  • 记梦
  • SILENTTRINITY最新部署指南:现代C2框架快速搭建
  • 第十天
  • 第九天
  • Codeforces Round 1040 (Div. 2)(A~D,E1赛后写出)
  • Codeforces Round 1040 (Div. 2)
  • 更改_Rootmotion控制角色移动