Objetivo do ActionName

87

Qual é a vantagem de definir um alias para um método de ação usando o atributo "ActionName"? Eu realmente não vejo muito benefício nisso, em fornecer ao usuário a opção de chamar um método de ação com algum outro nome. Depois de especificar o alias, o usuário pode chamar o método de ação apenas usando o alias. Mas se isso for necessário, por que o usuário não altera o nome do método de ação em vez de especificar um alias para ele?

Eu realmente apreciaria se alguém pudesse me fornecer um exemplo do uso de "ActionName" em um cenário em que ele pode fornecer um grande benefício ou é melhor usar.

Hasan Fahim
fonte
O motivo mais comum é quando você tem os métodos GET e POST e a assinatura é a mesma. veja a resposta de @Carlos Muñoz
RickAndMSFT de

Respostas:

132

Ele permite que você inicie sua ação com um número ou inclua qualquer caractere que .net não permite em um identificador. - O motivo mais comum é que permite que você tenha duas ações com a mesma assinatura (consulte as ações GET / POST Delete de qualquer controlador de scaffold)

Por exemplo: você pode permitir travessões no nome da ação do seu url http://example.com/products/create-productvs http://example.com/products/createproductou http://example.com/products/create_product.

public class ProductsController {

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

}
Buildstarted
fonte
46
Também permite usar nomes de ação que podem ser métodos Controller, como Exibir ou Arquivo.
grama de
@gram, não podemos chamar um método normal em um controlador sem especificar um alias? Eu acho que podemos.
Hasan Fahim
2
Se você quisesse nomear seu Action View(), você teria problemas porque todas as referências a View()em seu controlador atual resolveriam isso Actionao invés do método base subjacente. Então, para contornar isso, você usaria o ActionNameatributo para permitir a Viewação, mas internamente você o chamaria PublicViewou algo semelhante.
Buildstarted
2
Acho que você terá que return View("CreateProduct")ou o .NET vai reclamar sobre não encontrar uma visão como create-product.aspxou create-product.cshtml- pelo menos meu código funciona assim.
Aquiles
@gram Então, como você faz isso? Obviamente, não com um atributo.
João
60

Também é útil se você tiver duas ações com a mesma assinatura que devem ter o mesmo url.

Um exemplo simples:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}
Carlos Muñoz
fonte
Faz sentido, mas em quais cenários você usa HttpPost sem parâmetros? Eu sei que existem razões possíveis, como retornar JSON e evitar problemas de segurança com GET. Só estou me perguntando qual é o seu.
sessão regular de
1
A lista de parâmetros não é a parte importante aqui. Pode haver um exemplo melhor, o ponto é que você pode fazer isso se precisar.
Carlos Muñoz
1
podemos fazer isso substituindo "SomeActionPost" por "SomeAction" também, então qual é o uso de ActionName ??
Jilani pasha
Você não pode nomear ambos os métodos da mesma forma se eles tiverem os mesmos parâmetros. Neste caso, [ActionName] renomeia a ação (não o método) como registrado no ASP. Tabela de rota NET MVC para o pretendido.
Carlos Muñoz
38

Eu o uso quando o usuário baixa um relatório para que possa abrir facilmente seu arquivo csv diretamente no Excel.

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}
RHicke
fonte
2
Isso é muito inteligente :)
SRQ Coder
2

Experimente este código:

public class ProductsController
 {

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

}
Chary
fonte
1

Esta classe representa um atributo que é usado para o nome de uma ação. Também permite que os desenvolvedores usem um nome de ação diferente do nome do método.

Pradeep Yadav
fonte
0

Também é útil quando você precisa implementar a sobrecarga de método.

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


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

Aqui, um ActorView não aceita parâmetros e o outro aceita int. O primeiro método usado para visualizar a lista de atores e o outro é usado para mostrar a mesma lista de atores após excluir um item com ID como 'id'. Você pode usar o nome da ação como 'ActorViewOverload' sempre que precisar de sobrecarga de método.

Hrishikesh TT
fonte