Маршрутизация с несколькими параметрами с использованием 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)