2011-06-30 43 views
67

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 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ó?Mục đích của ActionName

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

+0

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

Trả lời

109

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 .net không cho phép trong số nhận dạng. - Lý do phổ biến nhất là nó cho phép bạn có hai Actions với cùng một chữ ký (xem GET/POST Xóa hành động của bất kỳ điều khiển scaffolded)

Ví dụ: bạn có thể cho phép dấu gạch ngang trong tên hành động url của bạn http://example.com/products/create-product vs http://example.com/products/createproduct hoặc http://example.com/products/create_product.

public class ProductsController { 

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

} 
+40

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 'Bộ điều khiển', như Chế độ xem hoặc Tệp. – gram

+0

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

+2

Nếu bạn muốn đặt tên cho 'Action'' View() 'thì bạn sẽ gặp vấn đề bởi vì tất cả các tham chiếu tới' View() 'trong bộ điều khiển hiện tại của bạn sẽ giải quyết' Action' thay vì phương thức cơ bản. Vì vậy, để giải quyết vấn đề này, bạn sẽ sử dụng thuộc tính 'ActionName' để cho phép hành động' View' nhưng bên trong bạn gọi nó là 'PublicView' hoặc một cái gì đó tương tự. – Buildstarted

51

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

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

public ActionResult SomeAction() 
{ 
    ... 
} 

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

Cảm ơn @Carlos Muñoz. Điều này có vẻ là một cách sử dụng tốt nó. –

+0

Làm cho tinh thần, nhưng trong những kịch bản nào bạn sử dụng HttpPost mà không có tham số? 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 bạn là gì. – regularmike

+1

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, điểm là bạn có thể làm điều đó nếu bạn cần. –

28

tôi sử dụng nó khi người dùng tải một báo cáo để họ có thể mở tập tin 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" }; 
} 
+0

Điều đó rất thông minh :) –

5

Thuộc tính ActionName được sử dụng để hiển thị các phương thức hành động .NET với các tên khác nhau với thế giới bên ngoài. Trong các trường hợp dưới đây, bạn có thể tận dụng ActionName thuộc tính:

  1. Đối với SEO (Search Engine Optimization), bạn muốn để lộ tên hành động có ý nghĩa hơn trong URL của bạn hơn tên phương pháp hành động NET.

  2. Để ngăn các sự cố liên quan đến quá tải hàm. Giả sử bạn có một tên phương thức hành động DELETE, phương thức GET và POST của nó chấp nhận cùng một tham số. Trong trường hợp này, bạn sẽ nhận được lỗi thời gian biên dịch. Để giải quyết vấn đề bạn có thể đổi tên phương thức .NET của bạn và với thuộc tính ActionName bạn vẫn có thể duy trì cùng tên được hiển thị.

Đối với lời giải thích chi tiết hơn, hãy truy cập ActionName attribute in ASP.NET MVC

-1

Nó cũng rất hữu ích khi bạn cần phải thực hiện phương pháp quá tải.

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à giá trị khác 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ị cùng một danh sách diễn viên 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ứ nơi nào bạn cần quá tải phương thức.

1

Hãy thử mã này:

public class ProductsController 
{ 

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

} 
0

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.