ASP.NET FromBody
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 ASP.NET 8 中的 FromBody 属性。此属性对于将 HTTP 请求正文数据绑定到操作方法参数至关重要。
ASP.NET 是一个用于构建现代 Web 应用程序的跨平台框架。FromBody 支持从 JSON 或 XML 请求正文中进行复杂数据绑定。
基本定义
ASP.NET 中的 FromBody 属性表示参数应使用请求正文进行绑定。它主要用于 POST、PUT 和 PATCH 请求。
当应用于参数时,FromBody 会告知模型绑定器使用 content-type 标头来选择合适的格式化程序。JSON 是请求正文最常见的格式。
FromBody 对于接受复杂数据结构的 Web API 至关重要。它与内置的 JSON 序列化器配合使用来反序列化请求正文。
ASP.NET FromBody 示例
以下示例演示了一个使用 FromBody 来创建和更新产品的 Web API 控制器。
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); app.MapControllers(); app.Run();
这设置了一个具有控制器支持的基本 ASP.NET 应用程序。AddControllers 方法配置了控制器所需的各种服务。
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private static List<Product> _products = new()
{
new Product(1, "Laptop", 999.99m),
new Product(2, "Mouse", 19.99m),
new Product(3, "Keyboard", 49.99m)
};
[HttpPost]
public IActionResult CreateProduct([FromBody] Product product)
{
if (product == null) return BadRequest();
product.Id = _products.Max(p => p.Id) + 1;
_products.Add(product);
return CreatedAtAction(nameof(GetProductById),
new { id = product.Id }, product);
}
[HttpPut("{id}")]
public IActionResult UpdateProduct(int id, [FromBody] Product product)
{
if (product == null || product.Id != id)
return BadRequest();
var existingProduct = _products.FirstOrDefault(p => p.Id == id);
if (existingProduct == null) return NotFound();
existingProduct.Name = product.Name;
existingProduct.Price = product.Price;
return NoContent();
}
[HttpGet("{id}")]
public IActionResult GetProductById(int id)
{
var product = _products.FirstOrDefault(p => p.Id == id);
if (product == null) return NotFound();
return Ok(product);
}
}
public record Product(int Id, string Name, decimal Price);
此控制器演示了两种使用 FromBody 的不同场景。第一个方法根据作为 JSON 发送的请求正文创建新产品。
第二个方法通过 ID 更新现有产品,更新数据来自请求正文。这两种方法都会验证输入数据。
创建方法中的 CreatedAtAction 结果返回 201 状态代码,Location 标头指向新资源。更新方法在成功时返回 204 No Content。
该示例展示了 FromBody 如何自动将 JSON 请求正文反序列化为 Product 对象。ApiController 属性支持自动模型验证和错误响应。
来源
在本文中,我们探讨了 ASP.NET 8 中的 FromBody 属性。这个强大的功能简化了从 HTTP 请求正文中绑定复杂数据的过程。