Tujuan ActionName

87

Apa manfaat menyetel alias untuk metode tindakan menggunakan atribut "ActionName"? Saya benar-benar tidak melihat banyak manfaat darinya, dalam memberikan pengguna opsi untuk memanggil metode tindakan dengan nama lain. Setelah menentukan alias, pengguna dapat memanggil metode tindakan hanya menggunakan alias. Tetapi jika itu diperlukan, mengapa pengguna tidak mengubah nama metode tindakan daripada menentukan alias untuk itu?

Saya akan sangat menghargai jika ada yang bisa memberi saya contoh penggunaan "ActionName" dalam skenario yang dapat memberikan manfaat besar atau cara terbaik untuk digunakan.

Hasan Fahim
sumber
Alasan paling umum adalah ketika Anda memiliki metode GET dan POST dan tanda tangannya sama. lihat jawaban @Carlos Muñoz
RickAndMSFT

Jawaban:

132

Ini memungkinkan Anda untuk memulai tindakan dengan angka atau menyertakan karakter apa pun yang tidak diizinkan .net dalam pengenal.- Alasan paling umum adalah memungkinkan Anda memiliki dua Tindakan dengan tanda tangan yang sama (lihat tindakan GET / POST Hapus dari pengontrol perancah apa pun)

Misalnya: Anda dapat mengizinkan tanda hubung dalam nama tindakan url http://example.com/products/create-productvs. http://example.com/products/createproductatau http://example.com/products/create_product.

public class ProductsController {

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

}
Buildstarted
sumber
46
Ini juga memungkinkan Anda menggunakan nama tindakan yang mungkin menggunakan metode Controller, seperti View atau File.
gram
@ Gram, tidak bisakah kita memanggil metode normal pada pengontrol tanpa menentukan alias? Saya pikir kita bisa.
Hasan Fahim
2
Jika Anda ingin menamai Anda Action View()maka Anda akan mengalami masalah karena semua referensi ke View()pengontrol Anda saat ini akan menyelesaikannya Actiondaripada metode dasar yang mendasarinya. Jadi untuk menyiasatinya, Anda akan menggunakan ActionNameatribut untuk memungkinkan Viewtindakan tetapi secara internal Anda akan menyebutnya PublicViewatau yang serupa.
Dibangun mulai
2
Saya pikir Anda harus return View("CreateProduct")atau .NET akan mengomel tentang tidak menemukan tampilan seperti create-product.aspxatau create-product.cshtml- Setidaknya kode saya berfungsi seperti ini.
Achilles
@gram Jadi bagaimana Anda melakukannya? Jelas tidak dengan atribut.
Yohanes
61

Ini juga berguna jika Anda memiliki dua Tindakan dengan tanda tangan yang sama yang seharusnya memiliki url yang sama.

Contoh sederhana:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}
Carlos Muñoz
sumber
Masuk akal, tetapi dalam skenario apa Anda menggunakan HttpPost tanpa parameter? Saya tahu ada kemungkinan alasan, seperti mengembalikan JSON dan menghindari masalah keamanan dengan GET. Aku hanya ingin tahu milikmu apa.
regularmike
2
Daftar parameter bukanlah bagian penting di sini. Mungkin ada contoh yang lebih baik, intinya Anda bisa melakukannya jika perlu.
Carlos Muñoz
1
kita bisa melakukannya dengan mengganti "SomeActionPost" menjadi "SomeAction" juga, lalu apa gunanya ActionName ??
Jilani pasha
Anda tidak dapat menamai kedua metode dengan sama jika keduanya memiliki parameter yang sama. Dalam kasus ini [ActionName] mengganti nama tindakan (bukan metode) seperti yang terdaftar di ASP. Tabel rute NET MVC ke tabel yang dituju.
Carlos Muñoz
38

Saya menggunakannya saat pengguna mengunduh laporan sehingga mereka dapat membuka file csv mereka langsung ke Excel dengan mudah.

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}
RHicke
sumber
2
Itu sangat pintar :)
SRQ Coder
2

Coba kode ini:

public class ProductsController
 {

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

}
Malu
sumber
1

Kelas ini mewakili atribut yang digunakan untuk nama suatu tindakan. Ini juga memungkinkan pengembang untuk menggunakan nama tindakan yang berbeda dari nama metode.

Pradeep Yadav
sumber
0

Ini juga berguna saat Anda perlu mengimplementasikan metode overloading.

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


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

Di sini satu ActorView tidak menerima parameter dan yang lainnya menerima int. Metode pertama digunakan untuk melihat daftar aktor dan metode lainnya digunakan untuk menampilkan daftar aktor yang sama setelah menghapus item dengan ID sebagai 'id'. Anda dapat menggunakan nama tindakan sebagai 'ActorViewOverload' di mana pun Anda memerlukan metode overloading.

Hrishikesh TT
sumber