ZetCode

ASP.NET FromQuery

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 FromQuery 属性。此属性对于将查询字符串参数绑定到操作方法参数至关重要。

ASP.NET 是一个跨平台、高性能的框架,用于构建现代 Web 应用程序。FromQuery 属性简化了查询参数的处理。

基本定义

ASP.NET 中的 FromQuery 属性将请求查询字符串参数绑定到操作方法参数。它在控制器操作中使用,用于从 URL 查询字符串中提取值。

当应用于参数时,FromQuery 指定值应从查询字符串中检索。它支持简单类型、复杂对象和集合。

FromQuery 是 ASP.NET 模型绑定系统的一部分,该系统会自动将请求数据映射到操作参数。它通常在 Web API 控制器中使用。

ASP.NET FromQuery 示例

以下示例演示了一个使用 FromQuery 按各种条件筛选产品的 Web API 控制器。

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

var app = builder.Build();

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

这设置了一个基本的 ASP.NET 应用程序,并支持控制器。MapControllers 方法为控制器启用属性路由。

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, "Electronics", 4.5),
        new Product(2, "Mouse", 19.99m, "Electronics", 4.0),
        new Product(3, "Notebook", 5.99m, "Stationery", 3.5),
        new Product(4, "Headphones", 89.99m, "Electronics", 4.2),
        new Product(5, "Pen", 1.99m, "Stationery", 3.8)
    };

    [HttpGet("filter")]
    public IActionResult FilterProducts(
        [FromQuery] string? name,
        [FromQuery] string? category,
        [FromQuery] decimal? minPrice,
        [FromQuery] decimal? maxPrice,
        [FromQuery] double? minRating)
    {
        var query = _products.AsQueryable();

        if (!string.IsNullOrEmpty(name))
        {
            query = query.Where(p => 
                p.Name.Contains(name, StringComparison.OrdinalIgnoreCase));
        }

        if (!string.IsNullOrEmpty(category))
        {
            query = query.Where(p => 
                p.Category.Equals(category, StringComparison.OrdinalIgnoreCase));
        }

        if (minPrice.HasValue)
        {
            query = query.Where(p => p.Price >= minPrice.Value);
        }

        if (maxPrice.HasValue)
        {
            query = query.Where(p => p.Price <= maxPrice.Value);
        }

        if (minRating.HasValue)
        {
            query = query.Where(p => p.Rating >= minRating.Value);
        }

        return Ok(query.ToList());
    }
}

public record Product(
    int Id, 
    string Name, 
    decimal Price, 
    string Category, 
    double Rating);

此控制器演示了 FromQuery 与多个可选参数的高级用法。FilterProducts 操作接受五个查询参数。

每个参数都用 [FromQuery] 标记,并设为可空以表示它们是可选的。该方法根据提供的参数动态构建查询。

例如,对 /api/products/filter?category=Electronics&minPrice=50 的请求将返回所有价格在 50 美元或以上的电子产品。参数可以任意组合。

该示例展示了 FromQuery 如何实现灵活的 API 端点,支持复杂的筛选场景。可空参数使所有筛选器都成为可选的。

测试 API

您可以使用 curl、Postman 或 Web 浏览器来测试 API。以下是一些示例请求

示例请求
# Get all electronics products
GET /api/products/filter?category=Electronics

# Get products with 'note' in name and rating >= 4
GET /api/products/filter?name=note&minRating=4

# Get stationery products between $1 and $10
GET /api/products/filter?category=Stationery&minPrice=1&maxPrice=10

每个请求演示了查询参数的不同组合。API 将仅返回符合所有指定条件的产品。

来源

Microsoft ASP.NET Web API 文档

在本文中,我们探讨了 ASP.NET 8 中的 FromQuery 属性。这个强大的功能简化了 Web API 中查询字符串参数的处理。

作者

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

列出所有 ASP.NET 教程