ActionName Attribute เป็น Action Selector ที่ใช้สำหรับตั้งชื่อ Action Method ให้ต่างจากชื่อจริง เราใช้ ActionName Attribute เมื่อต้องการให้ Action Method ถูกเรียกด้วยชื่อที่ต่างจากชื่อ Method จริง
[ActionName("AliasName")]
Controller
using System.Collections.Generic;
using System.Web.Mvc;
namespace DemoMvcApplication.Controllers {
public class HomeController : Controller {
[ActionName("ListCountries")]
public ViewResult Index() {
ViewData["Countries"] = new List {
"India", "Malaysia", "Dubai", "USA", "UK"
};
return View();
}
}
}
View
@{
ViewBag.Title = "Countries List";
}
Countries List
@foreach(string country in (List)ViewData["Countries"]) {
- @country
}
เนื่องจากเราตั้ง Action Name แตกต่างสำหรับ Index Method เมื่อพยายาม Navigate ด้วย Action Name "Index" จะได้ 404 Error
กรณีการใช้งานจริงของ ActionName
- SEO Friendly URLs - ตั้งชื่อสื่อความหมายกว่าชื่อ Method
- Multiple Actions ชื่อเดียวกัน - แยก GET/POST ด้วยชื่อต่างกัน
- Backward Compatibility - รองรับ URL เก่าเมื่อ Refactor Code
- Localization - URL หลายภาษา
ตัวอย่าง: แยก GET และ POST ด้วยชื่อต่างกัน
public class AccountController : Controller {
// GET: /Account/Login
[HttpGet]
[ActionName("Login")]
public ActionResult LoginGet() {
return View();
}
// POST: /Account/SignIn
[HttpPost]
[ActionName("SignIn")]
public ActionResult LoginPost(LoginViewModel model) {
if (ModelState.IsValid) {
// Login logic
}
return View("Login", model);
}
// GET: /Account/Register
[ActionName("Register")]
public ActionResult RegisterGet() { return View(); }
// POST: /Account/CreateAccount
[HttpPost]
[ActionName("CreateAccount")]
public ActionResult RegisterPost(RegisterViewModel model) { ... }
}
ตัวอย่าง: รองรับ URL เดิมหลังเปลี่ยนชื่อ Method
public class ProductController : Controller {
// Method ใหม่ชื่อ GetProductDetail
[ActionName("Detail")] // URL เดิม /Product/Detail/123 ยังทำงานได้
public ActionResult GetProductDetail(int id) {
var product = _service.GetById(id);
return View(product);
}
// รองรับ URL เก่า /Product/Show/123
[ActionName("Show")]
[Obsolete("Use Detail instead")]
public ActionResult OldShowMethod(int id) {
return RedirectToAction("Detail", new { id });
}
}
ข้อจำกัด
- ActionName ไม่สร้าง Overload ได้ (ไม่สามารถมี ActionName เดียวกันซ้ำใน Controller เดียวกัน)
- ไม่ส่งผลต่อ Route Attribute ([Route("...")]) - Route Attribute มี Priority สูงกว่า
- ใน ASP.NET Core ใช้
[ActionName("...")]เหมือนเดิม แต่แนะนำให้ใช้ Attribute Routing แทน