Призначення ActionName


87

У чому перевага встановлення псевдоніма для методу дії за допомогою атрибута "ActionName"? Я справді не бачу великої вигоди від цього, надаючи користувачеві можливість викликати метод дії з іншим іменем. Після вказівки псевдоніма користувач може викликати метод дії, лише використовуючи псевдонім. Але якщо це потрібно, то чому користувач не змінює назву методу дії, а не вказує для нього псевдонім?

Я був би дуже вдячний, якщо хтось може надати мені приклад використання "ActionName" у сценарії, коли це може забезпечити велику користь або найкраще використовувати.


Найпоширеніша причина - це коли у вас є і методи GET, і POST, а підпис однаковий. див. відповідь @Carlos Muñoz
RickAndMSFT

Відповіді:


132

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

Наприклад: ви можете дозволити тире у вашому назві дії URL-адреси http://example.com/products/create-productпроти http://example.com/products/createproductабо http://example.com/products/create_product.

public class ProductsController {

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

}

46
Це також дозволяє використовувати імена дій, які можуть бути такими методами Controller, як Перегляд або Файл.
грам

@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. Мені просто цікаво, що це таке.
регулярний майк

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

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', де б вам не потрібно було перевантажити метод.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.