Zweck von ActionName

87

Was bringt es, einen Alias ​​für eine Aktionsmethode mithilfe des Attributs "ActionName" festzulegen? Ich sehe wirklich keinen großen Vorteil darin, dem Benutzer die Möglichkeit zu geben, eine Aktionsmethode mit einem anderen Namen aufzurufen. Nach Angabe des Alias ​​kann der Benutzer die Aktionsmethode nur über den Alias ​​aufrufen. Wenn dies jedoch erforderlich ist, warum ändert der Benutzer dann nicht den Namen der Aktionsmethode, anstatt einen Alias ​​dafür anzugeben?

Ich würde mich sehr freuen, wenn mir jemand ein Beispiel für die Verwendung von "ActionName" in einem Szenario geben kann, in dem es große Vorteile bietet oder am besten zu verwenden ist.

Hasan Fahim
quelle
Der häufigste Grund ist, wenn Sie sowohl GET- als auch POST-Methoden haben und die Signatur identisch ist. siehe @ Carlos Muñoz Antwort
RickAndMSFT

Antworten:

132

Sie können Ihre Aktion mit einer Nummer beginnen oder ein beliebiges Zeichen, das .net nicht zulässt, in eine Kennung aufnehmen. - Der häufigste Grund ist, dass Sie zwei Aktionen mit derselben Signatur ausführen können (siehe GET / POST-Löschaktionen eines Gerüstcontrollers).

Beispiel: Sie können Bindestriche in Ihrem URL-Aktionsnamen http://example.com/products/create-productvs http://example.com/products/createproductoder zulassen http://example.com/products/create_product.

public class ProductsController {

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

}
Buildstarted
quelle
46
Außerdem können Sie Aktionsnamen verwenden, bei denen es sich möglicherweise um Methoden handelt Controller, z. B. Ansicht oder Datei.
Gramm
@gram, können wir auf einem Controller keine normale Methode aufrufen, ohne einen Alias ​​anzugeben? Ich denke wir können.
Hasan Fahim
2
Wenn Sie Ihre benennen möchten, Action View()haben Sie Probleme, da alle Verweise auf View()in Ihrem aktuellen Controller Actioneher auf diese als auf die zugrunde liegende Basismethode aufgelöst werden. Um dies zu umgehen, würden Sie das ActionNameAttribut verwenden, um die ViewAktion zuzulassen, aber intern würden Sie es PublicViewoder ähnliches nennen.
Buildstarted
2
Ich denke, Sie müssen return View("CreateProduct")oder .NET wird nörgeln , wenn Sie keine Ansicht wie create-product.aspxoder finden create-product.cshtml- Zumindest funktioniert mein Code so.
Achilles
@gram Wie machst du das? Offensichtlich nicht mit einem Attribut.
John
60

Es ist auch nützlich, wenn Sie zwei Aktionen mit derselben Signatur haben, die dieselbe URL haben sollten.

Ein einfaches Beispiel:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}
Carlos Muñoz
quelle
Sinnvoll, aber in welchen Szenarien verwenden Sie HttpPost ohne Parameter? Ich weiß, dass es mögliche Gründe gibt, wie die Rückgabe von JSON und die Vermeidung von Sicherheitsproblemen mit GET. Ich frage mich nur, was deins ist.
Regularmike
1
Die Parameterliste ist hier nicht der wichtige Teil. Es könnte ein besseres Beispiel geben, der Punkt ist, dass Sie es tun können, wenn Sie müssen.
Carlos Muñoz
1
Wir können das tun, indem wir "SomeActionPost" durch "SomeAction" ersetzen. Was ist dann die Verwendung von ActionName?
Jilani Pasha
Sie können nicht beide Methoden gleich benennen, wenn sie dieselben Parameter haben. In diesem Fall benennt [ActionName] die Aktion (nicht die Methode) um, wie in ASP registriert. NET MVC-Routentabelle zur vorgesehenen.
Carlos Muñoz
38

Ich benutze es, wenn der Benutzer einen Bericht herunterlädt, damit er seine CSV-Datei einfach direkt in Excel öffnen kann.

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}
RHicke
quelle
2
Das ist sehr klug :)
SRQ Coder
2

Versuchen Sie diesen Code:

public class ProductsController
 {

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

}
Vorsichtig
quelle
1

Diese Klasse stellt ein Attribut dar, das für den Namen einer Aktion verwendet wird. Außerdem können Entwickler einen anderen Aktionsnamen als den Methodennamen verwenden.

Pradeep Yadav
quelle
0

Dies ist auch hilfreich, wenn Sie eine Methodenüberladung implementieren müssen.

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


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

Hier akzeptiert ein ActorView keine Parameter und der andere int. Die erste Methode zum Anzeigen der Schauspielerliste und die andere Methode zum Anzeigen derselben Schauspielerliste nach dem Löschen eines Elements mit der ID 'id'. Sie können den Aktionsnamen als 'ActorViewOverload' verwenden, wenn Sie eine Methodenüberladung benötigen.

Hrishikesh TT
quelle