2011-06-30 6 views
67

¿Cuál es la ventaja de establecer un alias para un método de acción utilizando el atributo "Nombre de acción"? Realmente no veo mucho beneficio al proporcionarle al usuario la opción de llamar a un método de acción con otro nombre. Después de especificar el alias, el usuario puede llamar al método de acción solo utilizando el alias. Pero si es necesario, ¿por qué el usuario no cambia el nombre del método de acción en lugar de especificar un alias para él?Propósito de Nombre de acción

Realmente agradecería que alguien me pudiera dar un ejemplo del uso de "Nombre de acción" en un escenario en el que puede proporcionar un gran beneficio o es mejor usarlo.

+0

La razón más común es cuando tiene ambos métodos GET y POST y la firma es la misma. vea @Carlos Muñoz answer – RickAndMSFT

Respuesta

109

Le permite iniciar su acción con un número o incluir cualquier carácter que .net no permita en un identificador. - La razón más común es que le permite tener dos acciones con la misma firma (véase el GET/POST Borrar acciones de cualquier controlador de andamiaje)

Por ejemplo: usted podría permitir guiones dentro de su nombre de la acción url http://example.com/products/create-product vs http://example.com/products/createproduct o http://example.com/products/create_product.

public class ProductsController { 

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

} 
+40

También le permite usar nombres de acciones que podrían ser métodos en 'Controller', como View o File. – gram

+0

@gram, ¿no podemos llamar a un método normal en un controlador sin especificar un alias? Creo que podemos. –

+2

Si quisieras nombrar tu 'Action'' View() 'entonces tendrías problemas porque todas las referencias a' View() 'en tu controlador actual se resolverían con esa' Action' en lugar del método base subyacente. Para evitar esto, usaría el atributo 'ActionName' para permitir la acción' View', pero internamente lo llamaría 'PublicView' o algo similar. – Buildstarted

51

También es útil si tiene dos Acciones con la misma firma que deberían tener la misma url.

Un ejemplo sencillo:

public ActionResult SomeAction() 
{ 
    ... 
} 

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

Gracias @Carlos Muñoz. Este parece ser un buen uso de eso. –

+0

Tiene sentido, pero ¿en qué escenarios usa HttpPost sin parámetros? Sé que hay posibles razones, como devolver JSON y evitar problemas de seguridad con GET. Solo me pregunto qué es el tuyo. – regularmike

+1

La lista de parámetros no es la parte importante aquí. Puede haber un mejor ejemplo, el punto es que puedes hacerlo si lo necesitas. –

28

lo uso cuando el usuario descarga un informe para que puedan abrir su archivo CSV directamente en Excel fácilmente.

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

Eso es muy inteligente :) –

5

Los atributos ActionName se utilizan para exponer los métodos de acción .NET con diferentes nombres al mundo exterior. En las siguientes circunstancias, se puede hacer uso de ActionName atributos:

  1. para SEO (Search Engine Optimization) que desea exponer nombre de la acción más significativa en su URL de acción .NET nombre del método.

  2. Para evitar problemas de sobrecarga de funciones. Supongamos que tiene un nombre de método de acción DELETE, cuyos métodos de acción GET y POST aceptan el mismo parámetro. En este caso, obtendrá un error de tiempo de compilación. Para resolver el problema, puede cambiar el nombre de su método .NET y, con el atributo ActionName, puede mantener el mismo nombre expuesto.

Para una explicación más detallada, visite ActionName attribute in ASP.NET MVC

-1

También es útil cuando se necesita para poner en práctica la sobrecarga de métodos.

public ActionResult ActorView() 
     { 

      return View(actorsList); 
     } 


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

Aquí, un ActorView no acepta parámetros y el otro acepta int. El primer método utilizado para ver la lista de actores y el otro se usa para mostrar la misma lista de actores después de eliminar un elemento con ID como 'id'. Puedes usar el nombre de la acción como 'ActorViewOverload' donde necesites sobrecargar el método.

1

probar este código:

public class ProductsController 
{ 

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

} 
0

Esta clase representa un atributo que se utiliza para el nombre de una acción.También permite a los desarrolladores usar un nombre de acción diferente al nombre del método.

Cuestiones relacionadas