ZetCode

ASP.NET NonAction

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 NonAction 属性。此属性用于防止公共控制器方法被视为操作方法。

ASP.NET 是一个跨平台、高性能的框架,用于构建现代 Web 应用程序。NonAction 属性有助于有效组织控制器代码。

基本定义

ASP.NET 中的 NonAction 属性表示公共控制器方法不应被视为操作方法。这可以防止它通过路由请求被调用。

默认情况下,控制器类中的所有公共方法都被视为操作方法。NonAction 允许您将特定方法排除在此行为之外。

当您需要在控制器中提供不应直接通过 HTTP 请求调用的辅助方法时,NonAction 会很有用。它是 ASP.NET 控制器体系结构的一部分。

ASP.NET NonAction 示例

以下示例演示了一个使用 NonAction 的 Web API 控制器。

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

var app = builder.Build();

app.MapControllers();
app.Run();

这设置了一个基本的 ASP.NET 应用程序,并支持控制器。MapControllers 方法为控制器启用属性路由。

Controllers/ProductsController.cs
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private static List<Product> _products = new()
    {
        new Product(1, "Laptop", 999.99m),
        new Product(2, "Mouse", 19.99m),
        new Product(3, "Keyboard", 49.99m)
    };

    [HttpGet]
    public IActionResult GetAllProducts()
    {
        return Ok(_products);
    }

    [HttpGet("{id}")]
    public IActionResult GetProductById(int id)
    {
        var product = FindProductById(id);
        if (product == null) return NotFound();
        return Ok(product);
    }

    [NonAction]
    public Product? FindProductById(int id)
    {
        return _products.FirstOrDefault(p => p.Id == id);
    }

    [NonAction]
    public void LogProductAccess(string productName)
    {
        Console.WriteLine($"Product accessed: {productName}");
    }
}

public record Product(int Id, string Name, decimal Price);

此控制器演示了 NonAction 有用的两种场景。FindProductById 方法是操作方法使用的辅助方法。

LogProductAccess 方法展示了另一个常见的用例 - 一个不应作为端点公开的实用方法。两者都已标记为 NonAction。

如果没有 NonAction 属性,这些方法将作为可以通过 HTTP 请求访问的操作方法公开。该属性可以防止这种暴露。

该示例展示了 NonAction 如何通过在同一类中分离操作方法和辅助方法来帮助组织控制器代码。

来源

Microsoft ASP.NET Actions 文档

在本文中,我们探讨了 ASP.NET 8 中的 NonAction 属性。这项有用的功能通过隐藏方法来帮助维护干净的控制器架构。

作者

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

列出所有 ASP.NET 教程