ZetCode

ASP.NET RoutePrefix

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 RoutePrefix 属性。此属性通过定义通用的路由前缀来帮助组织 API 端点。

ASP.NET 是一个强大的用于构建 Web 应用程序和 API 的框架。RoutePrefix 通过集中化通用的路径段来简化路由管理。

基本定义

RoutePrefix 是 ASP.NET Web API 中的一个属性,用于指定控制器内所有操作的通用路由前缀。它减少了路由模板中的重复。

当应用于控制器时,RoutePrefix 定义了该控制器中所有路由的基路径。然后,单个操作方法可以指定相对路径。

RoutePrefix 与属性路由配合使用,可创建简洁、一致的 API 端点。对于版本化 API 或分组资源尤其有用。

ASP.NET RoutePrefix 示例

以下示例演示了一个使用 RoutePrefix 组织与产品相关的端点的 Web API 控制器。

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

var app = builder.Build();

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

此基本设置启用了 ASP.NET 8 中的属性路由。MapControllers 方法会激活诸如 RoutePrefix 之类的路由属性。

Controllers/ProductsController.cs
using Microsoft.AspNetCore.Mvc;

[ApiController]
[RoutePrefix("api/v1/products")]
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)
    };

    [HttpGet]
    [Route("")]
    public IActionResult GetAllProducts()
    {
        return Ok(_products);
    }

    [HttpGet]
    [Route("{id:int}")]
    public IActionResult GetProductById(int id)
    {
        var product = _products.FirstOrDefault(p => p.Id == id);
        if (product == null) return NotFound();
        return Ok(product);
    }

    [HttpGet]
    [Route("category/{categoryId}")]
    public IActionResult GetProductsByCategory(int categoryId)
    {
        var products = _products.Where(p => p.CategoryId == categoryId);
        return Ok(products);
    }

    [HttpPost]
    [Route("")]
    public IActionResult AddProduct([FromBody] Product product)
    {
        _products.Add(product);
        return CreatedAtAction(nameof(GetProductById), 
            new { id = product.Id }, product);
    }
}

public record Product(int Id, string Name, decimal Price, int CategoryId = 1);

此控制器使用 RoutePrefix 将基路径设置为 api/v1/products。所有操作路由都相对于此前缀。

GetAllProducts 方法与前缀组合形成 api/v1/productsGetProductById 方法将 /{id} 添加到前缀。

GetProductsByCategory 展示了如何使用其他路径段来扩展前缀。HttpPost 方法演示了 RoutePrefix 可与所有 HTTP 方法配合使用。

诸如 {id:int} 之类的路由约束可确保参数类型匹配。GetAllProducts 上的空 [Route("")] 直接附加到前缀。

来源

Microsoft ASP.NET Web API 文档

在本文中,我们探讨了 ASP.NET 8 中的 RoutePrefix 属性。这项有价值的功能有助于创建组织良好、易于维护的 API 路由结构。

作者

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

列出所有 ASP.NET 教程