ZetCode

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 控制器。

Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();
app.Run();

这设置了一个具有控制器支持的基本 ASP.NET 应用程序。AddControllers 方法配置了控制器所需的各种服务。

Controllers/ProductsController.cs
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 属性支持自动模型验证和错误响应。

来源

Microsoft ASP.NET Web API 文档

在本文中,我们探讨了 ASP.NET 8 中的 FromBody 属性。这个强大的功能简化了从 HTTP 请求正文中绑定复杂数据的过程。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 ASP.NET 教程