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 中处理查询字符串。