В ASP.NET MVC для действий есть @Url.Action
. Есть ли что-то подобное, например @Url.Api
, которое будет маршрутизироваться в/api/controller?
Как создать URL веб-API ASP.NET?
Ответ 1
ApiController имеет свойство Url, который имеет тип System.Web.Http.Routing.UrlHelper, который позволяет создавать URL-адреса для контроллеров api.
Пример:
public class ValuesController : ApiController
{
// GET /api/values
public IEnumerable<string> Get()
{
// returns /api/values/123
string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
return new string[] { "value1", "value2" };
}
// GET /api/values/5
public string Get(int id)
{
return "value";
}
...
}
Этот UrlHelper не существует ни в ваших представлениях, ни в стандартных контроллерах.
UPDATE:
И чтобы выполнить маршрутизацию вне ApiController, вы можете сделать следующее:
public class HomeController : Controller
{
public ActionResult Index()
{
string url = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "values", id = "123" }
);
return View();
}
}
или внутри представления:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>
Обратите внимание на маркер маршрута httproute = ""
, который важен.
Очевидно, это предполагает, что ваш маршрут Api называется DefaultApi
в вашем методе RegisterRoutes в Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Ответ 2
Он работает с более простой формой Url.Action
, поэтому вам не нужно ссылаться на любые имена маршрутизации:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Возможно, вы захотите добавить area = ""
, если URL-адрес необходим в пределах Района. (По умолчанию контроллеры Api находятся за пределами областей.) Я использую MVC 4.
Ответ 3
Хотите иметь возможность создавать ссылки в виде типа, без жестко заданных строк (имена контроллеров)?
Там есть нуджет! (и написано Марком Симаном)
https://github.com/ploeh/Hyprlinkr
Работает следующим образом:
Маршруты, как обычно:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Получить URL-адрес:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Результат:
http://localhost/api/foo/1337
Ответ 4
Вот метод KISS для ответа на вопрос:
Если это код, который вы бы использовали для создания URL-адреса контроллера MVC
@Url.Action("Edit", "MyController")
Чтобы получить URL-адрес для версии API контроллера (при условии, что вы используете одно и то же имя контроллера), вы можете использовать
@Url.Action("Edit", "api/MyController")
Весь метод Url.Action - это добавление корневого пути приложения с именем контроллера, за которым следует имя действия (если это не "Индекс", в этом случае он не добавляется. Если объект значений маршрута имеет свойство id, значение также добавляется к URL-адресу.