ZetCode

ASP.NET ChildActionOnly

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 ChildActionOnly 属性。此属性用于限制操作方法只能作为子操作进行调用。

子操作是控制器中从视图内部调用的特殊操作。它们可以在 ASP.NET MVC 中实现可重用的 UI 组件和部分页面更新。

基本定义

ASP.NET MVC 中的 ChildActionOnly 属性将控制器操作方法标记为只能作为子操作调用。它可防止通过 URL 直接访问。

当应用于操作方法时,ChildActionOnly 可确保该方法只能使用视图中的 Html.Action 或 Html.RenderAction 辅助方法来调用。

子操作对于创建需要服务器端处理的可重用组件(如菜单、小部件或部分视图)非常有用。它们有助于将复杂的视图组织成更小、更易于管理的部分。

ASP.NET ChildActionOnly 示例

以下示例演示了如何使用 ChildActionOnly 创建一个作为部分视图呈现的导航菜单。

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

var app = builder.Build();

app.UseStaticFiles();
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();

这设置了一个基本的 ASP.NET MVC 应用程序,其中包含控制器支持和路由。AddControllersWithViews 方法启用了 MVC 功能。

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

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [ChildActionOnly]
    public IActionResult NavigationMenu()
    {
        var menuItems = new List<MenuItem>
        {
            new MenuItem("Home", "Index", "Home"),
            new MenuItem("Products", "Index", "Products"),
            new MenuItem("About", "About", "Home"),
            new MenuItem("Contact", "Contact", "Home")
        };
        
        return PartialView("_NavigationMenu", menuItems);
    }
}

public record MenuItem(string Text, string Action, string Controller);

HomeController 包含两个操作。Index 操作用于提供主页面,而 NavigationMenu 被标记为 ChildActionOnly 并返回一个部分视图。

Views/Shared/_NavigationMenu.cshtml
@model List<MenuItem>

<nav>
    <ul>
        @foreach (var item in Model)
        {
            <li>
                <a asp-controller="@item.Controller" 
                   asp-action="@item.Action">
                    @item.Text
                </a>
            </li>
        }
    </ul>
</nav>

此部分视图呈现导航菜单。它从子操作接收菜单项并生成导航的 HTML。

Views/Home/Index.cshtml
@{
    ViewData["Title"] = "Home Page";
}

<div class="container">
    <h1>Welcome to our website</h1>
    
    @await Html.PartialAsync("_NavigationMenu")
    
    <div class="main-content">
        <p>This is the main content of the page.</p>
    </div>
</div>

主视图通过渲染部分视图来包含导航菜单。当呈现部分视图时,子操作会自动调用。

此示例展示了 ChildActionOnly 如何帮助创建可重用组件。导航菜单可以包含在任何视图中,同时保持逻辑分离。

来源

Microsoft ASP.NET 部分视图文档

在本文中,我们探讨了 ASP.NET 8 中的 ChildActionOnly 属性。此功能支持在 MVC 应用程序中创建模块化、可重用的 UI 组件。

作者

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

列出所有 ASP.NET 教程