ASP.NET 控制器
最后修改于 2023 年 10 月 18 日
在本文中,我们将介绍如何在 ASP.NET 应用程序中使用控制器。
ASP.NET 是一个跨平台、高性能、开源的框架,用于构建现代、支持云的 Web 应用程序。它由 Microsoft 开发。
控制器 是一个处理来自客户端的 HTTP 请求的类。它检索模型数据并将响应返回给客户端。
控制器是 MVC 模式的一部分。模型-视图-控制器 (MVC) 是一种架构模式,它将应用程序分为三个部分:模型、视图和控制器。
模型代表应用程序处理的数据。视图是发送给客户端的用户界面。它可以是 HTML 文件、PDF 文件、Excel 文件或图像。视图通常从模板创建,模板将模型数据与静态数据合并以形成用户界面。控制器是管理此过程的部分。
控制器操作
控制器公开操作。操作是根据特定的请求 URL 模式调用的方法。控制器操作必须是控制器类的公共方法;它不能是静态方法。
控制器操作返回一个操作结果。ASP.NET 支持多种操作结果类型,包括 ViewResult
、EmptyResult
、RedirectResult
、JsonResult
、ContentResult
和 FileContentResult
。
控制器约定
默认情况下,控制器位于 Controllers
目录中。
app.UseEndpoints(endppoints => { endppoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
这是控制器和 URL 模式的默认映射。
请求 URL | 控制器 | 操作 |
---|---|---|
https:// | Home | Index |
https:///Home/About | Home | 关于 |
https:///Product/List | Product | List |
控制器的名称以 Controller 结尾;例如,我们有 HomeController 或 ProductController。默认映射可以更改。我们也可以使用属性修改映射。
ASP.NET 控制器示例
下面是一个包含控制器的简单示例。
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); var app = builder.Build(); app.UseRouting(); app.UseEndpoints(endppoints => { endppoints.MapDefaultControllerRoute(); }); app.Run("https://:3000");
在 Program.cs
中,我们设置了控制器支持。
using Microsoft.AspNetCore.Mvc; namespace ControllerEx.Controllers; public class HomeController : Controller { public IActionResult Index() { ViewBag.Message = "Home page"; return View(); } [HttpGet("about")] public ContentResult About() { return Content("About page\n"); } [HttpGet("words")] public JsonResult Context() { var words = new List<string> { "red", "class", "rock", "war" }; return Json(words); } }
在 HomeController
中,我们设置了三个操作。
public IActionResult Index() { ViewBag.Message = "Home page"; return View(); }
Index
操作返回一个 HTML 视图。该视图是通过 Views/Home/Index.cshtml
中的模板构建的。
[HttpGet("about")] public ContentResult About() { return Content("About page\n"); }
此操作返回一个文本结果。它通过 HttpGet
属性重新映射到 /about
URL。
[HttpGet("words")] public JsonResult Context() { var words = new List<string> { "red", "class", "rock", "war" }; return Json(words); }
第三个操作返回 JSON 结果;它映射到 /words
。
<!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> @ViewBag.Message </p> </body> </html>
在 Index.cshtml
视图中,有一个 HTML 文件,我们通过 ViewBag
向其中添加动态内容。
$ curl localhost:3000 -i HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Date: Wed, 28 Sep 2022 14:04:45 GMT Server: Kestrel Transfer-Encoding: chunked <!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> Home page </p> </body>
对于主页,我们得到一个 HTML 输出。
$ curl localhost:3000/about -i HTTP/1.1 200 OK Content-Length: 11 Content-Type: text/plain; charset=utf-8 Date: Wed, 28 Sep 2022 14:05:42 GMT Server: Kestrel About page
对于关于页面,我们得到一个纯文本输出。
$ curl localhost:3000/words -i HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Wed, 28 Sep 2022 14:06:08 GMT Server: Kestrel Transfer-Encoding: chunked ["red","class","rock","war"]
对于 /words
模式,我们得到一个 JSON 输出。
在本文中,我们介绍了 ASP.NET 控制器。