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 请求的传入部分。
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` 属性显式绑定查询参数。
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 会自动将查询、表单和路径参数绑定到类型。
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` 在视图中获取查询参数。
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 应用程序。
using Microsoft.AspNetCore.Mvc;
namespace QueryStringEx.Controllers;
public class HomeController : Controller
{
[HttpGet("/")]
public IActionResult Home()
{
return View();
}
}
在控制器中,我们有一个单一的映射,它返回主页的视图。
<!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 中处理查询字符串。