Scopo di ActionName


87

Qual è il vantaggio di impostare un alias per un metodo di azione utilizzando l'attributo "ActionName"? Non ne vedo davvero molti vantaggi, nel fornire all'utente l'opzione di chiamare un metodo di azione con un altro nome. Dopo aver specificato l'alias, l'utente può chiamare il metodo di azione solo utilizzando l'alias. Ma se è necessario, perché l'utente non cambia il nome del metodo di azione invece di specificarne un alias?

Apprezzerei davvero se qualcuno mi potesse fornire un esempio dell'uso di "ActionName" in uno scenario in cui può fornire un grande vantaggio o è meglio usarlo.


Il motivo più comune è quando hai entrambi i metodi GET e POST e la firma è la stessa. vedi risposta @Carlos Muñoz
RickAndMSFT

Risposte:


132

Ti consente di iniziare la tua azione con un numero o includere qualsiasi carattere che .net non consente in un identificatore. - Il motivo più comune è che consente di avere due azioni con la stessa firma (vedere le azioni GET / POST Elimina di qualsiasi controller con scaffolding)

Ad esempio: potresti consentire i trattini nel nome dell'azione dell'URL http://example.com/products/create-productrispetto a http://example.com/products/createproducto http://example.com/products/create_product.

public class ProductsController {

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

}

46
Consente inoltre di utilizzare nomi di azioni su cui potrebbero essere applicati metodi Controller, come Visualizza o File.
grammo

@gram, non possiamo chiamare un metodo normale su un controller senza specificare un alias? Penso che possiamo.
Hasan Fahim,

2
Se volessi nominare il tuo Action View(), avresti problemi perché tutti i riferimenti View()nel tuo controller corrente si risolverebbero a quello Actionpiuttosto che al metodo di base sottostante. Quindi per aggirare questo problema dovresti usare l' ActionNameattributo per consentire l' Viewazione, ma internamente lo chiameresti PublicViewo qualcosa di simile.
Costruzione iniziata il

2
Penso che dovrai farlo return View("CreateProduct")o .NET si lamenterà di non trovare una vista come create-product.aspxo create-product.cshtml- Almeno il mio codice funziona in questo modo.
Achille

@gram Allora come si fa? Ovviamente non con un attributo.
Giovanni

61

È anche utile se hai due azioni con la stessa firma che dovrebbero avere lo stesso URL.

Un semplice esempio:

public ActionResult SomeAction()
{
    ...
}

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

Ha senso, ma in quali scenari usi HttpPost senza parametri? So che ci sono possibili ragioni, come la restituzione di JSON ed evitare problemi di sicurezza con GET. Mi chiedo solo cosa sia il tuo.
regularmike

2
L'elenco dei parametri non è la parte importante qui. Potrebbe esserci un esempio migliore, il punto è che puoi farlo se ne hai bisogno.
Carlos Muñoz

1
possiamo farlo sostituendo anche "SomeActionPost" con "SomeAction", allora qual è l'uso di ActionName ??
Jilani pasha

Non puoi assegnare a entrambi i metodi lo stesso nome se hanno gli stessi parametri. In questo caso [ActionName] rinomina l'azione (non il metodo) come registrato in ASP. Tabella di instradamento NET MVC a quella prevista.
Carlos Muñoz

38

Lo uso quando l'utente scarica un report in modo che possa aprire facilmente il proprio file csv direttamente in Excel.

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

2
Questo è molto intelligente :)
SRQ Coder

2

Prova questo codice:

public class ProductsController
 {

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

}

1

Questa classe rappresenta un attributo utilizzato per il nome di un'azione. Consente inoltre agli sviluppatori di utilizzare un nome di azione diverso dal nome del metodo.


0

È anche utile quando è necessario implementare il sovraccarico del metodo.

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


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

Qui un ActorView non accetta parametri e l'altro accetta int. Il primo metodo utilizzato per visualizzare l'elenco degli attori e l'altro viene utilizzato per mostrare lo stesso elenco degli attori dopo aver eliminato un elemento con ID come "id". È possibile utilizzare il nome dell'azione come "ActorViewOverload" ovunque sia necessario il sovraccarico del metodo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.