Цель ActionName

87

В чем преимущество установки псевдонима для метода действия с использованием атрибута «ActionName»? Я действительно не вижу в этом особой пользы, предоставляя пользователю возможность вызывать метод действия с другим именем. После указания псевдонима пользователь может вызывать метод действия только с использованием псевдонима. Но если это необходимо, то почему пользователь не меняет имя метода действия, а не указывает для него псевдоним?

Я был бы очень признателен, если бы кто-нибудь мог предоставить мне пример использования «ActionName» в сценарии, в котором он может принести большую пользу или лучше всего использовать.

Хасан Фахим
источник
Наиболее частая причина - когда у вас есть методы GET и POST, а подпись одна и та же. см. ответ @Carlos Muñoz
RickAndMSFT

Ответы:

132

Он позволяет вам начинать действие с числа или включать в идентификатор любой символ, который не допускается .net.- Наиболее частая причина в том, что это позволяет вам иметь два Действия с одной и той же подписью (см. Действия GET / POST Delete для любого контроллера с шаблоном)

Например: вы можете разрешить тире в имени действия URL http://example.com/products/create-productvs http://example.com/products/createproductили http://example.com/products/create_product.

public class ProductsController {

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

}
Сборка началась
источник
46
Он также позволяет использовать имена действий, которые могут быть методами Controller, например View или File.
грамм
@gram, нельзя ли вызвать обычный метод на контроллере без указания псевдонима? Я думаю, что сможем.
Хасан Фахим
2
Если вы захотите назвать свой, у Action View()вас возникнут проблемы, потому что все ссылки на View()в вашем текущем контроллере будут разрешать это, Actionа не базовый метод. Итак, чтобы обойти это, вы должны использовать ActionNameатрибут, разрешающий Viewдействие, но внутри вы бы назвали его PublicViewили что-то подобное.
Сборка начата
2
Я думаю, вам придется, return View("CreateProduct")иначе .NET будет ворчать, что не нашел представления, такого как create-product.aspxили create-product.cshtml- По крайней мере, мой код работает так.
Ахилл
@gram Так как ты это делаешь? Очевидно, не с атрибутом.
Джон
61

Это также полезно, если у вас есть два действия с одинаковой подписью, которые должны иметь одинаковый URL-адрес.

Простой пример:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}
Карлос Муньос
источник
Имеет смысл, но в каких сценариях вы используете HttpPost без параметров? Я знаю, что есть возможные причины, такие как возврат JSON и избежание проблем с безопасностью с помощью GET. Мне просто интересно, что у тебя.
regularmike
2
Список параметров здесь не важен. Может быть лучший пример, дело в том, что вы можете сделать это, если вам нужно.
Карлос Муньос,
1
мы можем сделать это, заменив «SomeActionPost» на «SomeAction», тогда в чем польза ActionName ??
Джилани паша
Вы не можете назвать оба метода одинаковыми, если они имеют одинаковые параметры. В этом случае [ActionName] переименовывает действие (не метод) как зарегистрированное в ASP. NET MVC к намеченной.
Карлос Муньос
38

Я использую его, когда пользователь загружает отчет, чтобы он мог легко открыть свой CSV-файл прямо в Excel.

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}
Рик
источник
2
Это очень умно :)
SRQ Coder
2

Попробуйте этот код:

public class ProductsController
 {

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

}
Чары
источник
1

Этот класс представляет атрибут, который используется для имени действия. Это также позволяет разработчикам использовать имя действия, отличное от имени метода.

Прадип Ядав
источник
0

Это также полезно, когда вам нужно реализовать перегрузку метода.

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


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

Здесь один ActorView не принимает параметров, а другой принимает int. Первый метод используется для просмотра списка актеров, а второй - для отображения того же списка актеров после удаления элемента с идентификатором «id». Вы можете использовать имя действия как «ActorViewOverload» везде, где вам нужна перегрузка метода.

Хришикеш ТТ
источник