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/MyMethod1https://localhost:59146/Home/MyMethod2


ใช้ 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 ได้

กรณีการใช้งาน 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
| Aspect | NonAction (Public) | Private Method |
|---|---|---|
| Visibility | Public (แต่ไม่ใช่ 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หรือprotectedMethods แทน - ใช้
[ApiExplorerSettings(IgnoreApi = true)]เพื่อซ่อนจาก Swagger/OpenAPI - แยก Logic ไป Service Classes