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

ความสำคัญของ NonActionAttribute ใน ASP.NET MVC C#

Attribute NonAction ใช้เมื่อเราต้องการ Public Method ใน Controller แต่ไม่ต้องการให้ถือเป็น Action Method Action Method คือ Public Method ใน Controller ที่สามารถ Invoke ผ่าน URL ได้ ดังนั้น โดย Default ถ้าเรามี Public Method ใดๆ ใน Controller มันสามารถ Invoke ผ่าน URL Request ได้ เพื่อจำกัดการเข้าถึง Public Methods ใน Controller สามารถใช้ NonAction Attribute ได้

Controller โดยไม่มี NonAction


using System.Web.Mvc;

namespace DemoMvcApplication.Controllers {
    public class HomeController : Controller {
        public string MyMethod1() {
            return "

My Method 1 Invoked

"; } public string MyMethod2() { return "

My Method 2 Invoked

"; } } }

Invoke ทั้งสอง Method ผ่าน URL:

  • https://localhost:59146/Home/MyMethod1
  • https://localhost:59146/Home/MyMethod2

ความสำคัญของ NonActionAttribute ใน ASP.NET MVC C#

ความสำคัญของ NonActionAttribute ใน ASP.NET MVC C#

ใช้ NonAction Attribute

สมมติ MyMethod2 เป็น Internal Purpose ไม่ต้องการให้ Invoke ผ่าน URL ต้อง Decorate ด้วย NonAction Attribute


using System.Web.Mvc;

namespace DemoMvcApplication.Controllers {
    public class HomeController : Controller {
        public string MyMethod1() {
            return "

My Method 1 Invoked

"; } [NonAction] public string MyMethod2() { return "

My Method 2 Invoked

"; } } }

Output - MyMethod2 ไม่สามารถเข้าถึงผ่าน URL ได้

ความสำคัญของ NonActionAttribute ใน ASP.NET MVC C#

กรณีการใช้งาน NonAction

  • Helper Methods - Methods ที่ใช้ร่วมภายใน Controller เท่านั้น
  • Private Business Logic - Logic ที่ไม่ควร Expose เป็น Endpoint
  • Partial/Shared Logic - โค้ดร่วมระหว่าง Actions หลายตัว
  • Deprecated Actions - Actions เก่าที่ยังไม่ได้ลบแต่ไม่ต้องการให้เข้าถึงได้

ตัวอย่าง Helper Method


public class OrderController : Controller {
    public ActionResult Create(OrderViewModel model) {
        if (!ValidateOrder(model)) {
            return View(model);
        }
        // ...
    }
    
    [NonAction]
    private bool ValidateOrder(OrderViewModel model) {
        // Complex validation logic
        return ModelState.IsValid && model.Total > 0;
    }
    
    [NonAction]
    private decimal CalculateDiscount(Order order) {
        // Discount calculation logic
        return order.Total * 0.1m;
    }
}

NonAction vs Private Methods

AspectNonAction (Public)Private Method
VisibilityPublic (แต่ไม่ใช่ Action)Private
Unit Testingทดสอบได้โดยตรงทดสอบผ่าน Public Methods
Override ใน Derived Controllerได้ (ถ้า Virtual)ไม่ได้
gọiจาก View/Child Actionไม่ได้ไม่ได้

ใน ASP.NET Core

ASP.NET Core ไม่มี NonActionAttribute (อยู่ใน Microsoft.AspNetCore.Mvc.NonActionAttribute แต่ทำงานเหมือนเดิม) วิธีที่แนะนำ:

  • ใช้ private หรือ protected Methods แทน
  • ใช้ [ApiExplorerSettings(IgnoreApi = true)] เพื่อซ่อนจาก Swagger/OpenAPI
  • แยก Logic ไป Service Classes