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

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

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

Ответ 1

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

Вы можете передавать произвольные параметры через строку запроса, но вы также можете настроить настраиваемые маршруты для обработки с помощью 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.

Ответ 3

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