Dans ASP.NET MVC, nous avons @Url.Action
des actions. Y a-t-il quelque chose de similaire comme @Url.Api
qui serait acheminé vers / api / controller?
Dans ASP.NET MVC, nous avons @Url.Action
des actions. Y a-t-il quelque chose de similaire comme @Url.Api
qui serait acheminé vers / api / controller?
Réponses:
L' ApiController a une propriété appelée Url qui est de type System.Web.Http.Routing.UrlHelper qui vous permet de créer des URL pour les contrôleurs d'API.
Exemple:
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";
}
...
}
Cet UrlHelper n'existe ni dans vos vues ni dans les contrôleurs standard.
METTRE À JOUR:
Et pour effectuer le routage en dehors d'un ApiController, vous pouvez effectuer les opérations suivantes:
public class HomeController : Controller
{
public ActionResult Index()
{
string url = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "values", id = "123" }
);
return View();
}
}
ou à l'intérieur d'une vue:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>
Notez le httproute = ""
jeton d'itinéraire qui est important.
Évidemment, cela suppose que votre route Api est appelée DefaultApi
dans votre méthode RegisterRoutes dans Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
pour générer des routes Api en dehors d'un HttpControllerContext.
Cela fonctionne avec la forme la plus simple de Url.Action
sorte que vous ne devez référencer aucun nom de routage:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Vous pouvez ajouter un area = ""
si l'URL est nécessaire dans une zone. (Les contrôleurs Api sont en dehors des zones par défaut.) J'utilise MVC 4.
Url.Action
est utilisé à partir d'une vue. Url
est de type System.Web.Mvc.UrlHelper
et ne correspond pas aux WebApi
itinéraires. Ceci est la raison pour laquelle vous avez besoin du paramètre supplémentaire: new { httproute = "" }
.
httproute""
mais ce n'est pas du mappage = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
mais cela a parfaitement fonctionné
Vous voulez être en mesure de générer des liens de manière sécurisée, sans chaînes codées en dur (noms de contrôleur)?
Il y a une pépite pour ça! (et c'est écrit par Mark Seeman)
https://github.com/ploeh/Hyprlinkr
Fonctionne comme ceci:
Itinéraires, comme d'habitude:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Obtenez une URL:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Résultat:
http://localhost/api/foo/1337
Voici la méthode KISS pour répondre à la question:
S'il s'agit du code que vous utiliseriez pour créer une URL de contrôleur MVC
@Url.Action("Edit", "MyController")
Afin d'obtenir une URL pour la version API du contrôleur (en supposant que vous utilisez le même nom de contrôleur), vous pouvez utiliser
@Url.Action("Edit", "api/MyController")
Tout ce que fait la méthode Url.Action est d'ajouter le chemin racine de l'application, avec le nom du contrôleur, suivi du nom de l'action (sauf s'il s'agit de "Index", auquel cas il n'est pas ajouté. Si l'objet de valeurs d'itinéraire a un identifiant property la valeur est également ajoutée à l'URL.
api/
avant mon contrôleur.