Routing dengan Beberapa Parameter menggunakan ASP.NET MVC

139

Perusahaan kami sedang mengembangkan API untuk produk kami dan kami berpikir untuk menggunakan ASP.NET MVC. Saat merancang API kami, kami memutuskan untuk menggunakan panggilan seperti yang di bawah ini bagi pengguna untuk meminta informasi dari API dalam format XML:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&api_key=b25b959554ed76058ac220b7b2e0a026

Seperti yang Anda lihat, beberapa parameter dilewatkan (yaitu artistdan api_key). Dalam ASP.NET MVC, artistakan menjadi controller, getImagestindakan, tetapi bagaimana saya akan melewatkan beberapa parameter ke tindakan?

Apakah ini mungkin menggunakan format di atas?

CodingWithoutComments
sumber

Jawaban:

279

Parameter didukung langsung di MVC dengan hanya menambahkan parameter ke metode tindakan Anda. Diberi tindakan seperti berikut:

public ActionResult GetImages(string artistName, string apiKey)

MVC akan secara otomatis mengisi parameter ketika diberi URL seperti:

/Artist/GetImages/?artistName=cher&apiKey=XXX

Satu case khusus tambahan adalah parameter bernama "id". Setiap parameter bernama ID dapat dimasukkan ke dalam path daripada querystring, jadi sesuatu seperti:

public ActionResult GetImages(string id, string apiKey)

akan diisi dengan benar dengan URL seperti berikut:

/Artist/GetImages/cher?apiKey=XXX

Selain itu, jika Anda memiliki skenario yang lebih rumit, Anda dapat menyesuaikan aturan perutean yang digunakan MVC untuk menemukan tindakan. File global.asax Anda berisi aturan perutean yang dapat disesuaikan. Secara default aturannya seperti ini:

routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

Jika Anda ingin mendukung url seperti

/Artist/GetImages/cher/api-key

Anda bisa menambahkan rute seperti:

routes.MapRoute(
            "ArtistImages",                                              // Route name
            "{controller}/{action}/{artistName}/{apikey}",                           // URL with parameters
            new { controller = "Home", action = "Index", artistName = "", apikey = "" }  // Parameter defaults
        );

dan metode seperti contoh pertama di atas.

Ryan Brunner
sumber
1
Saya bekerja dengan .NET 4 dan MVC. Saya hanya bisa melewatkan satu parameter di jalur. URL ini {controller} / {action} / {artistName} / {apikey} tidak memetakan 2 parameter untuk saya tetapi hanya memicu kesalahan 404. Sejauh yang saya tahu Anda hanya dapat melewati 1 parameter di jalur. Apa yang saya lakukan salah?
DavidHyogo
1
@ Davidvidyogo - Saya mengalami masalah yang sama. Untuk alasan apa pun, meskipun saya menentukan tindakan default, saya harus benar-benar meletakkan tindakan yang saya inginkan di tautan html saya, bukan hanya controller, dan parameter.
Shaggy13spe
5
@ Davidvidyogo: Saya memiliki masalah yang sama dan menemukan bahwa parameter templat rute Anda harus sama persis dengan nama parameter metode tindakan misalnya untuk rute yang didefinisikan sebagai {controller} / {action} / {artistName} / {apikey} metode tindakan harus memiliki tanda tangan publik ActionResult MyMethod (string artistName, string apikey)
Sudhanshu Mishra
6
Juga, pastikan URL Anda tidak tertangkap oleh rute default sebelum mencapai rute khusus Anda. Ini akan menggunakan kecocokan pertama berdasarkan pada bagaimana Anda mendefinisikannya. Dalam kasus saya, saya mencoba menggunakan rute "MyController / {year} / {month}" untuk default Index, tetapi rute {controller} / {action} / {id} cocok dengan URL saya (MyController / 2015) / 04), jadi saya mendapatkan 404 karena tidak ada tindakan dengan nama 2015 ada. Memindahkan rute khusus saya ke atas memperbaiki masalah.
Sam
Nama parameter di routeconfig tidak cocok dengan tanda tangan Action saya, itu sebabnya itu tidak berfungsi, saya mengikuti langkah-langkah yang dijelaskan oleh @dotnetguy dan berhasil
pepitomb
26

Dimulai dengan MVC 5, Anda juga dapat menggunakan Routing Atribut untuk memindahkan konfigurasi parameter URL ke pengontrol Anda.

Diskusi terperinci tersedia di sini: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

Ringkasan:

Pertama, Anda mengaktifkan perutean atribut

 public class RouteConfig 
 {
     public static void RegisterRoutes(RouteCollection routes)
     {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

         routes.MapMvcAttributeRoutes();
     } 
 }

Kemudian Anda dapat menggunakan atribut untuk menentukan parameter dan tipe data opsional

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)
Bernard Vander Beken
sumber
5
Routing atribut dalam ASP.NET Core MVC dijelaskan di docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
Bernard Vander Beken
21

Anda dapat melewati parameter sewenang-wenang melalui string kueri, tetapi Anda juga dapat mengatur rute khusus untuk menanganinya dengan cara yang tenang:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&
                                  api_key=b25b959554ed76058ac220b7b2e0a026

Itu bisa:

routes.MapRoute(
    "ArtistsImages",
    "{ws}/artists/{artist}/{action}/{*apikey}",
    new { ws = "2.0", controller="artists" artist = "", action="", apikey="" }
    );

Jadi, jika seseorang menggunakan rute berikut:

ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/

Itu akan membawa mereka ke tempat yang sama contoh querystring Anda lakukan.

Contoh di atas hanyalah contoh, dan tidak menerapkan aturan dan batasan bisnis yang harus Anda atur untuk memastikan orang tidak 'meretas' URL.

George Stocker
sumber