Маршрутизація з кількома параметрами за допомогою ASP.NET MVC


139

Наша компанія розробляє API для нашої продукції, і ми думаємо про використання ASP.NET MVC. Розробляючи наш API, ми вирішили використовувати дзвінки, подібні до наведеного нижче, щоб користувач вимагав інформацію з API у форматі XML:

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

Як бачимо, передаються кілька параметрів (тобто artistі api_key). У ASP.NET MVC, artistбуде правильним controller, getImagesдія, але як би я передати кілька параметрів до дії?

Чи можливо це навіть у форматі вище?

Відповіді:


279

Параметри безпосередньо підтримуються в MVC шляхом простого додавання параметрів до ваших методів дій. Здійснюється така дія:

public ActionResult GetImages(string artistName, string apiKey)

MVC автоматично заповнить параметри, коли йому буде надана така URL-адреса, як:

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

Ще один спеціальний випадок - це параметри з назвою "id". Будь-який параметр з ім'ям ID може бути поставлений у шлях, а не в рядок запитів, так що:

public ActionResult GetImages(string id, string apiKey)

буде правильно заповнене URL-адресою, наприклад:

/Artist/GetImages/cher?apiKey=XXX

Крім того, якщо у вас складніші сценарії, ви можете налаштувати правила маршрутизації, які MVC використовує для пошуку дії. Ваш файл global.asax містить правила маршрутизації, які можна налаштувати. За замовчуванням правило виглядає так:

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

Якщо ви хочете підтримати URL, як

/Artist/GetImages/cher/api-key

Ви можете додати маршрут на зразок:

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

і такий спосіб, як перший приклад вище.


1
Я працюю з .NET 4 та MVC. Я можу пропустити лише один параметр у шляху. Ця URL-адреса {контролер} / {action} / {artistName} / {apikey} не відповідає двом параметрам для мене, а просто викликає помилку 404. Наскільки я можу вам сказати, ви можете пропустити лише 1 параметр шляху. Що я роблю неправильно?
DavidHyogo

1
@DavidHyogo - у мене виникло те саме питання. З будь-якої причини, хоч я і вказав дію за замовчуванням, мені довелося фактично помістити потрібну дію у моє html-посилання, а не лише контролер та параметри.
Shaggy13spe

5
@DavidHyogo: У мене виникла та сама проблема, і я виявив, що параметри шаблону маршруту повинні точно відповідати назвам параметрів методу дії, наприклад, для маршруту, визначеного як {controller} / {action} / {artistName} / {apikey} метод дії повинен мати підпис public ActionResult MyMethod (string artistName, string apikey)
Sudhanshu Mishra

6
Крім того, переконайтеся, що ваша URL-адреса не потрапила за замовчуванням, перш ніж вона досягне вашого спеціального. Він використовуватиме перший збіг на основі того, як ви їх визначили. У моєму випадку я намагався використати маршрут "MyController / {рік} / {місяць}" за замовчуванням індексу, але маршрут {контролер} / {дія} / {id} відповідав моїй URL-адресі (MyController / 2015 / 04), тому я отримував 404, оскільки жодної дії з назвою 2015 року не існувало. Переміщення мого власного маршруту до вершини вирішило проблему.
Сем

Назва параметрів у routeconfig не відповідала моєму підпису Action, тому воно не працювало, я дотримувався кроків, описаних @dotnetguy, і це спрацювало
pepitomb

26

Починаючи з MVC 5, ви також можете використовувати маршрутизацію атрибутів, щоб перемістити конфігурацію параметра URL до контролерів.

Детальна дискусія доступна тут: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

Підсумок:

Спочатку ви включаєте маршрутизацію атрибутів

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

         routes.MapMvcAttributeRoutes();
     } 
 }

Потім ви можете використовувати атрибути для визначення параметрів та необов'язково типів даних

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)

5
Маршрутизація атрибутів у ASP.NET Core MVC описана на docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
Бернард Вандер Став

21

Ви можете передавати довільні параметри через рядок запиту, але ви також можете налаштувати власні маршрути, щоб обробити це RESTful способом:

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

Це може бути:

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

Тож якщо хтось користувався таким маршрутом:

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

Це займе їх там же, де і ваш приклад запиту рядків.

Наведене вище - лише приклад, і він не застосовує ділових правил та обмежень, які вам доведеться встановити, щоб люди не «зламали» URL-адресу.

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