No ASP.NET MVC, temos @Url.Action
para ações. Existe algo semelhante ao @Url.Api
que encaminharia para / api / controller?
No ASP.NET MVC, temos @Url.Action
para ações. Existe algo semelhante ao @Url.Api
que encaminharia para / api / controller?
Respostas:
O ApiController possui uma propriedade chamada Url, do tipo System.Web.Http.Routing.UrlHelper, que permite a construção de URLs para controladores de API.
Exemplo:
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";
}
...
}
Esse UrlHelper não existe nem na sua exibição nem nos controladores padrão.
ATUALIZAR:
E para fazer o roteamento fora de um ApiController, você pode fazer o seguinte:
public class HomeController : Controller
{
public ActionResult Index()
{
string url = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "values", id = "123" }
);
return View();
}
}
ou dentro de uma vista:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>
Observe o httproute = ""
token de rota que é importante.
Obviamente, isso pressupõe que sua rota da API seja chamada DefaultApi
no seu método RegisterRoutes em Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
para gerar rotas Api fora de um HttpControllerContext.
Funciona com a forma mais simples, Url.Action
portanto você não precisa fazer referência a nenhum nome de roteamento:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Você pode adicionar um area = ""
se o URL for necessário em uma Área. (Por padrão, os controladores da API estão fora do Areas). Estou usando o MVC 4.
Url.Action
está sendo usada em uma Visualização. Url
é do tipo System.Web.Mvc.UrlHelper
e não é mapeado para WebApi
rotas. É por isso que você precisa do parâmetro extra: new { httproute = "" }
.
httproute""
mas não está mapeando = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
mas que funcionou perfeitamente
Deseja gerar links de maneira segura, sem seqüências codificadas (nomes de controladores)?
Há uma pepita para isso! (e é escrito por Mark Seeman)
https://github.com/ploeh/Hyprlinkr
Funciona assim:
Rotas, como sempre:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Obtenha um URL:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Resultado:
http://localhost/api/foo/1337
Aqui está o método KISS para responder à pergunta:
Se esse for o código que você usaria para criar uma URL do controlador MVC
@Url.Action("Edit", "MyController")
Para obter um URL para a versão da API do controlador (assumindo que você use o mesmo nome do controlador), você pode usar
@Url.Action("Edit", "api/MyController")
Tudo o que o método Url.Action está fazendo é anexar o caminho raiz do aplicativo, com o nome do controlador, seguido pelo nome da ação (a menos que seja "Índice", nesse caso, não será anexado. Se o objeto de valores de rota tiver um ID Na propriedade, o valor também é anexado ao URL.
api/
nome do meu controlador antes.