Mục đích của ActionName


87

Lợi ích của việc đặt bí danh cho phương thức hành động bằng thuộc tính "ActionName" là gì? Tôi thực sự không thấy nhiều lợi ích của nó, trong việc cung cấp cho người dùng tùy chọn để gọi một phương thức hành động với một số tên khác. Sau khi chỉ định bí danh, người dùng chỉ có thể gọi phương thức hành động bằng cách sử dụng bí danh. Nhưng nếu điều đó là bắt buộc thì tại sao người dùng không thay đổi tên của phương thức hành động thay vì chỉ định một bí danh cho nó?

Tôi thực sự đánh giá cao nếu ai đó có thể cung cấp cho tôi một ví dụ về việc sử dụng "ActionName" trong một trường hợp mà nó có thể mang lại lợi ích lớn hoặc tốt nhất là sử dụng.


Lý do phổ biến nhất là khi bạn có cả hai phương thức GET và POST và chữ ký giống nhau. xem câu trả lời của @Carlos Muñoz
RickAndMSFT

Câu trả lời:


132

Nó cho phép bạn bắt đầu hành động của mình bằng một số hoặc bao gồm bất kỳ ký tự nào mà .net không cho phép trong mã định danh. - Lý do phổ biến nhất là nó cho phép bạn có hai Hành động với cùng một chữ ký (xem hành động GET / POST Delete của bất kỳ bộ điều khiển được lắp ráp nào)

Ví dụ: bạn có thể cho phép dấu gạch ngang trong tên hành động url của mình http://example.com/products/create-productso với http://example.com/products/createproducthoặc http://example.com/products/create_product.

public class ProductsController {

    [ActionName("create-product")]
    public ActionResult CreateProduct() {
        return View();
    }

}

46
Nó cũng cho phép bạn sử dụng tên hành động có thể là các phương thức trên Controller, như View hoặc File.
gram

@gram, chúng ta có thể gọi một phương thức bình thường trên bộ điều khiển mà không chỉ định bí danh không? Tôi nghĩ rằng chúng ta có thể.
Hasan Fahim

2
Nếu bạn muốn đặt tên của mình Action View()thì bạn sẽ gặp vấn đề bởi vì tất cả các tham chiếu đến View()trong bộ điều khiển hiện tại của bạn sẽ giải quyết điều đó Actionthay vì phương thức cơ sở bên dưới. Vì vậy, để giải quyết vấn đề này, bạn sẽ sử dụng ActionNamethuộc tính để cho phép Viewhành động nhưng trong nội bộ bạn sẽ gọi nó PublicViewhoặc một cái gì đó tương tự.
Bắt đầu vào

2
Tôi nghĩ rằng bạn sẽ phải return View("CreateProduct")hoặc .NET sẽ khó khăn về việc không tìm thấy chế độ xem như create-product.aspxhoặc create-product.cshtml- Ít nhất mã của tôi hoạt động như thế này.
Achilles

@gram Vì vậy, làm thế nào để bạn làm điều đó? Rõ ràng là không phải với một thuộc tính.
John

61

Nó cũng hữu ích nếu bạn có hai Hành động có cùng chữ ký phải có cùng một url.

Một ví dụ đơn giản:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}

Có lý, nhưng bạn sử dụng HttpPost mà không có tham số trong những trường hợp nào? Tôi biết có những lý do có thể xảy ra, như trả lại JSON và tránh các vấn đề bảo mật với GET. Tôi chỉ tự hỏi của bạn là gì.
regularmike

2
Danh sách tham số không phải là phần quan trọng ở đây. Có thể có một ví dụ tốt hơn, vấn đề là bạn có thể làm điều đó nếu bạn cần.
Carlos Muñoz

1
chúng ta có thể làm điều đó bằng cách thay thế "SomeActionPost" thành "SomeAction", vậy thì việc sử dụng ActionName là gì ??
Jilani pasha

Bạn không thể đặt tên cho cả hai phương thức giống nhau nếu chúng có cùng tham số. Trong trường hợp này [ActionName] đổi tên hành động (không phải phương thức) như đã đăng ký trong ASP. Bảng tuyến đường NET MVC đến mục tiêu đã định.
Carlos Muñoz

38

Tôi sử dụng nó khi người dùng tải xuống báo cáo để họ có thể mở tệp csv của họ trực tiếp vào Excel một cách dễ dàng.

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}

2
Điều đó rất thông minh :)
SRQ Coder

2

Hãy thử mã này:

public class ProductsController
 {

    [ActionName("create-product")]
    public ActionResult CreateProduct() 
    {
        return View("CreateProduct");
    }

}

1

Lớp này đại diện cho một thuộc tính được sử dụng cho tên của một hành động. Nó cũng cho phép các nhà phát triển sử dụng một tên hành động khác với tên phương thức.


0

Nó cũng hữu ích khi bạn cần thực hiện nạp chồng phương thức.

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


        [ActionName("ActorViewOverload")]
        public ActionResult ActorView(int id)
        {              
            return RedirectToAction("ActorView","Home");
        }
`

Ở đây một ActorView không chấp nhận tham số và cái kia chấp nhận int. Phương pháp đầu tiên được sử dụng để xem danh sách diễn viên và một phương pháp khác được sử dụng để hiển thị danh sách diễn viên tương tự sau khi xóa một mục có ID là 'id'. Bạn có thể sử dụng tên hành động là 'ActorViewOverload' bất cứ khi nào bạn cần nạp chồng phương thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.