Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การใช้งาน ChildActionOnly Attribute ใน ASP.NET MVC C#

Child Action เข้าถึงได้เฉพาะผ่าน Child Request เท่านั้น จะไม่ตอบสนองต่อ URL Requests หากพยายามเรียกผ่าน URL จะเกิด Runtime Error: "Child action is accessible only by a child request" Child Action Methods สามารถ Invoke ได้โดยการสร้าง Child Request จาก View โดยใช้ HTML Helpers Action() และ RenderAction()

Child Action Methods ต่างจาก NonAction Methods ที่ NonAction Methods ไม่สามารถ Invoke ด้วย Action() หรือ RenderAction() Helpers ได้

Child Action Error เมื่อเรียกผ่าน URL

การใช้งาน ChildActionOnly Attribute ใน ASP.NET MVC C#

Controller


using System.Collections.Generic;
using System.Web.Mvc;

namespace DemoMvcApplication.Controllers {
    public class HomeController : Controller {
        public ActionResult Index() {
            return View();
        }
        
        [ChildActionOnly]
        public ActionResult Countries(List countries) {
            return View(countries);
        }
    }
}

Index View (เรียก Child Action)


@{
    ViewBag.Title = "Countries List";
}

Countries List

@Html.Action("Countries", new { countries = new List() { "USA", "UK", "India", "Australia" } })

Countries View (Partial View)


@model List
@foreach (string country in Model) {
    
  • @country
}

Output

การใช้งาน ChildActionOnly Attribute ใน ASP.NET MVC C#

ใช้ RenderAction() แทน Action()


@{
    Html.RenderAction("Countries", new { 
        countries = new List() { "USA", "UK", "India", "Australia" } 
    });
}

ความแตกต่าง:

  • @Html.Action(...) - คืนค่า MvcHtmlString เขียนต่อใน View ได้
  • @{ Html.RenderAction(...); } - เขียนตรงไปยัง Response Stream (Performance ดีกว่าเล็กน้อย)

เมื่อไหร่ควรใช้ ChildActionOnly

  • Partial Views ที่ใช้ซ้ำหลายที่ (Widgets, Navigation, Sidebars)
  • Logic ที่ซับซ้อนใน View ที่ไม่ควรอยู่ใน View โดยตรง
  • ข้อมูลที่ต้อง Query เพิ่มเติมเฉพาะส่วนนั้น (ไม่ใช่ข้อมูลหลักของ Page)
  • Action ที่ Return PartialViewResult

ใน ASP.NET Core

ASP.NET Core ไม่มี ChildActionOnly และ @Html.Action แทนด้วย:

  • View Components - แทน Child Actions สำหรับ Reusable UI Components
  • Partial Tag Helper - ``
  • ViewComponent Tag Helper - ``

// View Component (ASP.NET Core)
public class CountriesViewComponent : ViewComponent {
    public IViewComponentResult Invoke(List countries) {
        return View(countries);
    }
}

// View

// หรือ
@await Component.InvokeAsync("Countries", new { countries = Model.Countries })