web-dev-qa-db-fra.com

Comment créer une URL Web ASP.NET?

Dans ASP.NET MVC, nous avons @Url.Action pour les actions. Y a-t-il quelque chose de similaire comme @Url.Api qui acheminerait vers/api/controller?

116
Shane Courtrille

ApiController possède une propriété appelée rl qui est de type System.Web.Http.Routing.UrlHelper qui vous permet de construire des URL pour les contrôleurs 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.


MISE À JOUR:

Et pour effectuer un 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>

Remarquez le httproute = "" jeton de route qui est important.

Évidemment, cela suppose que votre route Api s'appelle DefaultApi dans votre méthode RegisterRoutes dans Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
136
Darin Dimitrov

Cela fonctionne avec la forme plus simple de Url.Action donc vous n’avez pas à référencer de noms de routage:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

Vous voudrez peut-être 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.

44
Gábor Imre

Voulez-vous pouvoir générer des liens de manière sécurisée, sans chaînes codées en dur (noms de contrôleurs)?

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 }

Obtenir une URL:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

Résultat:

http://localhost/api/foo/1337
6
Cristi Diaconescu

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 utilisant le même nom de contrôleur), vous pouvez utiliser

@Url.Action("Edit", "api/MyController")

Tout ce que la méthode Url.Action fait consiste à 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 ce n'est pas ajouté. Si l'objet de valeurs d'itinéraire a un id property la valeur est également ajoutée à l'URL.

3
James Bunch