Маршрутизация с несколькими параметрами с использованием ASP.NET MVC


141

Наша компания разрабатывает 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действие, но как бы я передать несколько параметров к действию?

Возможно ли это даже при использовании указанного выше формата?

Ответы:


282

Параметры напрямую поддерживаются в 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
        );

и метод, подобный первому примеру выше.


2
Я работаю с .NET 4 и MVC. Я могу передать только один параметр в пути. Этот URL-адрес {controller} / {action} / {artistName} / {apikey} для меня не сопоставляется с двумя параметрами, а просто вызывает ошибку 404. Насколько я могу судить, вы можете передать только 1 параметр в пути. Что я делаю не так?
DavidHyogo

2
@DavidHyogo - Я столкнулся с той же проблемой. По какой-то причине, несмотря на то, что я указал действие по умолчанию, мне пришлось фактически поместить действие, которое я хотел, в свою ссылку html, а не только контроллер и параметры.
Shaggy13spe

6
@DavidHyogo: у меня была такая же проблема, и я обнаружил, что параметры вашего шаблона маршрута должны точно соответствовать именам параметров метода действия, например, для маршрута, определенного как {controller} / {action} / {artistName} / {apikey}, метод действия должен иметь подпись public ActionResult MyMethod (string artistName, string apikey)
Судханшу Мишра

7
Кроме того, убедитесь, что ваш URL-адрес не попадает в маршрут по умолчанию, прежде чем он достигнет вашего пользовательского. Он будет использовать первое совпадение в зависимости от того, как вы их определили. В моем случае я пытался использовать маршрут MyController / {year} / {month} по умолчанию для Index, но маршрут {controller} / {action} / {id} совпадал с моим URL (MyController / 2015 / 04), поэтому я получал 404, потому что действия с именем 2015 не существовало. Перемещение моего пользовательского маршрута наверх устранило проблему.
Сэм,

Имя параметров в routeconfig не соответствовало моей подписи Action, поэтому оно не работало, я выполнил шаги, описанные @dotnetguy, и это сработало
pepitomb

27

Начиная с 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

Вы можете передавать произвольные параметры через строку запроса, но вы также можете настроить собственные маршруты, чтобы обрабатывать их в режиме REST:

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.