Cel ActionName

87

Jaka jest korzyść z ustawienia aliasu dla metody akcji za pomocą atrybutu „ActionName”? Naprawdę nie widzę wiele korzyści z tego, że daje użytkownikowi możliwość wywołania metody akcji o innej nazwie. Po określeniu aliasu, użytkownik może wywołać metodę akcji tylko przy użyciu aliasu. Ale jeśli jest to wymagane, to dlaczego użytkownik nie zmienia nazwy metody akcji zamiast określić jej alias?

Byłbym naprawdę wdzięczny, gdyby ktoś mógł podać mi przykład użycia „ActionName” w scenariuszu, w którym może przynieść duże korzyści lub jest najlepszy w użyciu.

Hasan Fahim
źródło
Najczęstszym powodem jest to, że masz obie metody GET i POST, a podpis jest taki sam. zobacz odpowiedź @Carlos Muñoz
RickAndMSFT

Odpowiedzi:

132

Pozwala na rozpoczęcie akcji liczbą lub zawarcie w identyfikatorze dowolnego znaku, na który .net nie pozwala. - Najczęstszym powodem jest to, że pozwala mieć dwie akcje z tym samym podpisem (zobacz akcje GET / POST Delete dowolnego kontrolera szkieletowego)

Na przykład: możesz zezwolić na myślniki w nazwie działania adresu URL w http://example.com/products/create-productporównaniu z http://example.com/products/createproductlub http://example.com/products/create_product.

public class ProductsController {

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

}
Buildstarted
źródło
46
Pozwala także używać nazw akcji, które mogą być metodami Controller, takich jak Widok lub Plik.
gram
@gram, czy nie możemy wywołać normalnej metody na kontrolerze bez określenia aliasu? Myślę że możemy.
Hasan Fahim
2
Gdybyś chciał nazwać swój Action View(), miałbyś problemy, ponieważ wszystkie odwołania do View()w twoim obecnym kontrolerze rozwiązałyby się Actionraczej z tym , niż z podstawową metodą. Aby to obejść, użyłbyś ActionNameatrybutu, aby zezwolić na Viewakcję, ale wewnętrznie nazwałbyś to PublicViewlub coś podobnego.
Budowanie rozpoczęto
2
Myślę, że będziesz musiał return View("CreateProduct")lub .NET będzie zrzędzić, że nie znajdziesz widoku, takiego jak create-product.aspxlub create-product.cshtml- Przynajmniej mój kod działa w ten sposób.
Achilles
@gram Jak więc to robisz? Oczywiście nie z atrybutem.
Jan
61

Jest to również przydatne, jeśli masz dwie akcje z tym samym podpisem, które powinny mieć ten sam adres URL.

Prosty przykład:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}
Carlos Muñoz
źródło
Ma to sens, ale w jakich scenariuszach używasz HttpPost bez parametrów? Wiem, że są możliwe powody, takie jak zwrot JSON i unikanie problemów z bezpieczeństwem w GET. Zastanawiam się tylko, co jest twoje.
regularmike
2
Lista parametrów nie jest tutaj ważną częścią. Może być lepszy przykład, chodzi o to, że możesz to zrobić, jeśli zajdzie taka potrzeba.
Carlos Muñoz
1
możemy to zrobić, zastępując również „SomeActionPost” na „SomeAction”, więc jaki jest pożytek z ActionName?
Jilani pasha
Nie możesz nazwać obu metod tak samo, jeśli mają te same parametry. W tym przypadku [ActionName] zmienia nazwę akcji (nie metody) na zarejestrowaną w ASP. NET MVC do zamierzonej.
Carlos Muñoz
38

Używam go, gdy użytkownik pobiera raport, aby mógł łatwo otworzyć plik csv bezpośrednio w programie Excel.

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}
RHicke
źródło
2
To bardzo sprytne :)
SRQ Coder
2

Wypróbuj ten kod:

public class ProductsController
 {

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

}
Ostrożny
źródło
1

Ta klasa reprezentuje atrybut używany w nazwie akcji. Pozwala również programistom na użycie innej nazwy akcji niż nazwa metody.

Pradeep Yadav
źródło
0

Jest to również pomocne, gdy trzeba zaimplementować przeciążanie metod.

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


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

Tutaj jeden ActorView nie akceptuje żadnych parametrów, a drugi akceptuje int. Pierwsza metoda służy do przeglądania listy aktorów, a druga służy do wyświetlania tej samej listy aktorów po usunięciu elementu o identyfikatorze „id”. Możesz użyć nazwy akcji jako „ActorViewOverload” wszędzie tam, gdzie potrzebujesz przeciążenia metody.

Hrishikesh TT
źródło