ZetCode

ASP.NET 控制器

最后修改于 2023 年 10 月 18 日

在本文中,我们将介绍如何在 ASP.NET 应用程序中使用控制器。

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

控制器 是一个处理来自客户端的 HTTP 请求的类。它检索模型数据并将响应返回给客户端。

控制器是 MVC 模式的一部分。模型-视图-控制器 (MVC) 是一种架构模式,它将应用程序分为三个部分:模型、视图和控制器。

模型代表应用程序处理的数据。视图是发送给客户端的用户界面。它可以是 HTML 文件、PDF 文件、Excel 文件或图像。视图通常从模板创建,模板将模型数据与静态数据合并以形成用户界面。控制器是管理此过程的部分。

控制器操作

控制器公开操作。操作是根据特定的请求 URL 模式调用的方法。控制器操作必须是控制器类的公共方法;它不能是静态方法。

控制器操作返回一个操作结果。ASP.NET 支持多种操作结果类型,包括 ViewResultEmptyResultRedirectResultJsonResultContentResultFileContentResult

控制器约定

默认情况下,控制器位于 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 控制器示例

下面是一个包含控制器的简单示例。

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");

Program.cs 中,我们设置了控制器支持。

Controllers/HomeController.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

Views/Home/Index.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>
        @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 控制器。

作者

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

列出所有 ASP.NET 教程