Propósito de ActionName

87

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

Realmente agradecería si alguien me pudiera proporcionar un ejemplo del uso de "ActionName" en un escenario en el que puede proporcionar un gran beneficio o es mejor usarlo.

Hasan Fahim
fuente
La razón más común es cuando tiene los métodos GET y POST y la firma es la misma. ver la respuesta de @Carlos Muñoz
RickAndMSFT

Respuestas:

132

Te permite comenzar tu 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 (consulte las acciones GET / POST Delete de cualquier controlador con scaffolded)

Por ejemplo: podría permitir guiones dentro del nombre de la acción de su URL http://example.com/products/create-productfrente a http://example.com/products/createproducto http://example.com/products/create_product.

public class ProductsController {

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

}
Buildstarted
fuente
46
También le permite usar nombres de acciones que pueden ser métodos Controller, como Ver o Archivo.
gramo
@gram, ¿no podemos llamar a un método normal en un controlador sin especificar un alias? Creo que podemos.
Hasan Fahim
2
Si quisiera nombrar su, Action View()entonces tendría problemas porque todas las referencias a View()en su controlador actual se resolverían a eso en Actionlugar del método base subyacente. Entonces, para evitar esto, usaría el ActionNameatributo para permitir la Viewacción, pero internamente lo llamaría PublicViewo algo similar.
Build comenzó el
2
Creo que tendrá que hacerlo return View("CreateProduct")o .NET se molestará por no encontrar una vista como create-product.aspxo create-product.cshtml- Al menos mi código funciona así.
Achilles
@gram Entonces, ¿cómo haces eso? Obviamente no con un atributo.
Juan
61

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

Un simple ejemplo:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}
Carlos Muñoz
fuente
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. Me pregunto cuál es el tuyo.
regularmike
2
La lista de parámetros no es la parte importante aquí. Podría haber un mejor ejemplo, el punto es que puede hacerlo si lo necesita.
Carlos Muñoz
1
podemos hacer eso reemplazando "SomeActionPost" por "SomeAction" también, entonces ¿cuál es el uso de ActionName?
Jilani pasha
No puede nombrar ambos métodos de la misma manera si tienen los mismos parámetros. En este caso, [ActionName] cambia el nombre de la acción (no del método) como registrada en ASP. NET MVC tabla de enrutamiento a la prevista.
Carlos Muñoz
38

Lo uso cuando el usuario descarga un informe para que pueda 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" };
}
RHicke
fuente
2
Eso es muy inteligente :)
SRQ Coder
2

Prueba este código:

public class ProductsController
 {

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

}
Cuidadoso
fuente
1

Esta clase representa un atributo que se usa 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.

Pradeep Yadav
fuente
0

También es útil cuando necesita implementar 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 utiliza para mostrar la misma lista de actores después de eliminar un elemento con ID como 'id'. Puede usar el nombre de la acción como 'ActorViewOverload' siempre que necesite una sobrecarga de métodos.

Hrishikesh TT
fuente