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.


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();
    }

}

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()
{
    ...
}

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" };
}

2
Das ist sehr klug :)
SRQ Coder

2

Versuchen Sie diesen Code:

public class ProductsController
 {

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

}

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.