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

วิธีตั้ง Alias Name ให้ Action Method ใน ASP.NET MVC C#

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

  1. SEO Friendly URLs - ตั้งชื่อสื่อความหมายกว่าชื่อ Method
  2. Multiple Actions ชื่อเดียวกัน - แยก GET/POST ด้วยชื่อต่างกัน
  3. Backward Compatibility - รองรับ URL เก่าเมื่อ Refactor Code
  4. 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 แทน