Obtenir l’URL complète de l’action dans ASP.NET MVC

Existe-t-il un moyen intégré d’obtenir l’URL complète d’une action?

Je cherche quelque chose comme GetFullUrl("Action", "Controller") qui renverrait quelque chose comme http://www.fred.com/Controller/Action .

La raison pour laquelle je recherche ceci est d’éviter les URL codées en dur dans les e-mails automatisés générés afin que les URL puissent toujours être générées par rapport à l’emplacement actuel du site.

Il y a une surcharge d’Url.Action qui prend comme argument le protocole souhaité (par exemple, http, https). Si vous spécifiez ceci, vous obtenez une URL complète.

Voici un exemple qui utilise le protocole de la requête en cours dans une méthode d’action:

 var fullUrl = this.Url.Action("Edit", "Posts", new { id = 5 }, this.Request.Url.Scheme); 

HtmlHelper (@Html) a également une surcharge de la méthode ActionLink que vous pouvez utiliser dans razor pour créer un élément d’ancrage, mais il requirejs également les parameters hostName et fragment. Je choisirais donc d’utiliser @ Url.Action à nouveau:

  Copy this link and post it anywhere on the internet!  

Comme Paddy l’a mentionné: si vous utilisez une surcharge d’ UrlHelper.Action() qui spécifie explicitement le protocole à utiliser, l’URL générée sera absolue et pleinement qualifiée au lieu d’être relative.

J’ai écrit un article de blog intitulé Comment créer des URL d’action absolue en utilisant la classe UrlHelper dans laquelle je suggère d’écrire une méthode d’extension personnalisée dans un souci de lisibilité:

 ///  /// Generates a fully qualified URL to an action method by using /// the specified action name, controller name and route values. ///  /// The URL helper. /// The name of the action method. /// The name of the controller. /// The route values. /// The absolute URL. public static ssortingng AbsoluteAction(this UrlHelper url, ssortingng actionName, ssortingng controllerName, object routeValues = null) { ssortingng scheme = url.RequestContext.HttpContext.Request.Url.Scheme; return url.Action(actionName, controllerName, routeValues, scheme); } 

Vous pouvez ensuite simplement l’utiliser comme cela dans votre vue:

 @Url.AbsoluteAction("Action", "Controller") 

C’est peut-être juste que je suis vraiment, vraiment pointilleux, mais j’aime bien définir les constantes une seule fois. Si vous utilisez l’une des approches définies ci-dessus, votre constante d’action sera définie plusieurs fois.

Pour éviter cela, vous pouvez effectuer les opérations suivantes:

  public class Url { public ssortingng LocalUrl { get; } public Url(ssortingng localUrl) { LocalUrl = localUrl; } public override ssortingng ToSsortingng() { return LocalUrl; } } public abstract class Controller { public Url RootAction => new Url(GetUrl()); protected abstract ssortingng Root { get; } public Url BuildAction(ssortingng actionName) { var localUrl = GetUrl() + "/" + actionName; return new Url(localUrl); } private ssortingng GetUrl() { if (Root == "") { return ""; } return "/" + Root; } public override ssortingng ToSsortingng() { return GetUrl(); } } 

Créez ensuite vos contrôleurs, par exemple le DataController:

  public static readonly DataController Data = new DataController(); public class DataController : Controller { public const ssortingng DogAction = "dog"; public const ssortingng CatAction = "cat"; public const ssortingng TurtleAction = "turtle"; protected override ssortingng Root => "data"; public Url Dog => BuildAction(DogAction); public Url Cat => BuildAction(CatAction); public Url Turtle => BuildAction(TurtleAction); } 

Alors, utilisez-le simplement comme:

  // GET: Data/Cat [ActionName(ControllerRoutes.DataController.CatAction)] public ActionResult Etisys() { return View(); } 

Et à partir de votre fichier .cshtml (ou de tout code)

  

C’est certainement beaucoup plus de travail, mais je rest tranquille, sachant que la validation du temps de compilation est de mon côté.

C’est ce que vous devez faire.

 https://stackoverflow.com/questions/2005367/getting-full-url-of-action-in-asp-net-mvc/@Url.Action(action,controller, null, Request.Url.Scheme) 

J’avais un problème avec cela, mon serveur fonctionnait derrière un équilibreur de charge. L’équilibreur de charge mettait fin à la connexion SSL / TLS. Il a ensuite transmis la demande aux serveurs Web en utilisant http.

En utilisant la méthode Url.Action () avec Request.Url.Schema, il continuait à créer une URL http, dans mon cas, pour créer un lien dans un email automatisé (que mon PenTester n’aimait pas).

J’ai peut-être sortingché un peu, mais c’est exactement ce dont j’avais besoin pour forcer une URL https:

 Click Here 

En fait, j’utilise un AppSetting web.config pour pouvoir utiliser http lors du débogage local, mais tous les environnements de test et de production utilisent la transformation pour définir la valeur https.

Cette question est spécifique à ASP .NET, mais je suis certain que certains d’entre vous bénéficieront du javascript indépendant du système, ce qui est bénéfique dans de nombreuses situations.

UPDATE: La manière d’obtenir l’url formée en dehors de la page est bien décrite dans les réponses ci-dessus.

Ou vous pourriez faire un oneliner comme suit:

 new UrlHelper(actionExecutingContext.RequestContext).Action( "SessionTimeout", "Home", new {area = ssortingng.Empty}, actionExecutingContext.Request.Url!= null? actionExecutingContext.Request.Url.Scheme : "http" ); 

du filtre ou:

 new UrlHelper(this.Request.RequestContext).Action( "Details", "Journey", new { area = productType }, this.Request.Url!= null? this.Request.Url.Scheme : "http" ); 

Cependant, bien souvent, il faut obtenir l’URL de la page en cours, pour les cas utilisant Html.Action et mettre le nom et le contrôleur de la page dans laquelle vous vous trouvez me semble étrange. Ma préférence dans de tels cas est d’utiliser plutôt JavaScript. Ceci est particulièrement bon dans les systèmes qui sont à moitié réécrits MVT moitié web-formes moitié-script-moitié moitié Dieu sait quoi- et pour obtenir l’URL de la page actuelle, il faut utiliser une méthode différente à chaque fois.

L’une des méthodes consiste à utiliser JavaScript pour obtenir l’URL: window.location.hrefdocument.URL