ZetCode

ASP.NET 查询字符串

最后修改于 2023 年 10 月 18 日

在本文中,我们将展示如何在 ASP.NET 中处理查询字符串。

ASP.NET 是一个跨平台、高性能、开源的框架,用于构建现代、支持云的 Web 应用程序。它由 Microsoft 开发。

查询字符串

查询字符串或查询参数是统一资源定位符 (URL) 的一部分,它为指定的参数分配值。这是将数据发送到目标服务器的一种方式。

http://example.com/api/users?name=John%20Doe&occupation=gardener

查询参数位于 `?` 字符之后。多个字段用 `&` 分隔。空格等特殊字符会被编码。在上面的字符串中,空格被编码为 `%20` 值。

ASP.NET 查询字符串示例

在第一个示例中,我们通过 `HttpRequest` 获取查询字符串。`HttpRequest` 代表单个 HTTP 请求的传入部分。

Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", (HttpRequest request) =>
{
    string name = request.Query["name"];
    string occupation = request.Query["occupation"];
    string msg = $"{name} is a {occupation}\n";

    return Results.Content(msg);
});

app.Run("https://:3000");

在示例中,我们通过 `HttpRequest` 获取两个查询字符串。

string name = request.Query["name"];

我们使用请求对象的 `Query` 属性获取 `name` 查询参数。

$ curl 'localhost:3000?name=John%20Doe&occupation=gardener'
John Doe is a gardener

使用 `FromQuery` 进行显式绑定

可以使用 `FromQuery` 属性显式绑定查询参数。

Program.cs
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", ([FromQuery(Name = "name")] string? name,
                 [FromQuery(Name = "occupation")] string? occupation) =>
{
    if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(occupation))
    {
        return Results.BadRequest("bad request");
    }

    string msg = $"{name} is a {occupation}\n";
    return Results.Content(msg);
});

app.Run("https://:3000");

在示例中,我们将两个查询参数显式绑定到两个变量。此外,查询字符串是必需的。

if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(occupation))
{
    return Results.BadRequest("bad request");
}

如果未收到这两个参数的值,我们将向客户端发送一个错误请求。

$ curl 'localhost:3000?name=Roger%20Roe&occupation=driver'
Roger Roe is a driver

对于包含所有查询参数的正确请求,我们会收到响应。

$ curl 'localhost:3000?name=Roger%20Roe'
"bad request"

由于我们未提供第二个参数,因此收到了错误请求响应。

查询参数的自动绑定

ASP.NET 会自动将查询、表单和路径参数绑定到类型。

Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", (string name, string occupation) =>
{
    string msg = $"{name} is a {occupation}\n";
    return Results.Content(msg);
});

app.Run("https://:3000");

在示例中,ASP.NET 会自动将查询参数绑定到 `name` 和 `occupation` 变量。

$ curl 'localhost:3000?name=Roger%20Roe&occupation=driver'
Roger Roe is a driver

视图中的查询参数

我们可以通过 `@Context.Request.Query` 在视图中获取查询参数。

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

var app = builder.Build();

app.UseRouting();
app.UseEndpoints(endppoints =>
{
    endppoints.MapDefaultControllerRoute();
});

app.Run("https://:3000");

我们设置了一个包含控制器和视图的 ASP.NET 应用程序。

Controllers/Home/HomeController.cs
using Microsoft.AspNetCore.Mvc;

namespace QueryStringEx.Controllers;

public class HomeController : Controller
{
    [HttpGet("/")]
    public IActionResult Home()
    {
        return View();
    }
}

在控制器中,我们有一个单一的映射,它返回主页的视图。

Views/Home/Home.cshtml
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home page</title>
</head>
<body>

    <p>
        @Context.Request.Query["name"] is a @Context.Request.Query["occupation"]
    </p>
    
</body>
</html>

在视图中,我们引用了两个查询参数。

$ curl 'localhost:3000?name=Roger%20Roe&occupation=driver'
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home page</title>
</head>
<body>

    <p>
        Roger Roe is a driver
    </p>
    
</body>

我们创建一个带有两个查询参数的 GET 请求,并收到 HTML 输出。

在本文中,我们学习了如何在 ASP.NET 中处理查询字符串。

作者

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

列出所有 ASP.NET 教程