Ottenere l’URL completo dell’azione in ASP.NET MVC

Esiste un modo integrato per ottenere l’URL completo di un’azione?

Sto cercando qualcosa come GetFullUrl("Action", "Controller") che restituirebbe qualcosa come http://www.fred.com/Controller/Action .

La ragione per cui sto cercando questo è di evitare gli URL hardcoding nelle e-mail automatiche che vengono generate in modo che gli URL possano sempre essere generati rispetto alla posizione corrente del sito.

C’è un sovraccarico di Url.Action che accetta il tuo protocollo desiderato (ad esempio http, https) come argomento – se lo specifichi, ottieni un URL completo.

Ecco un esempio che utilizza il protocollo della richiesta corrente in un metodo di azione:

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

HtmlHelper (@Html) ha anche un sovraccarico del metodo ActionLink che puoi usare nel razor per creare un elemento di ancoraggio, ma richiede anche i parametri hostName e frammento. Quindi dovrei semplicemente usare di nuovo @ Url.Action:

  Copy this link and post it anywhere on the internet!  

Come ha detto Paddy: se si utilizza un sovraccarico di UrlHelper.Action() che specifica esplicitamente il protocollo da utilizzare, l’URL generato sarà assoluto e pienamente qualificato invece di essere relativo.

Ho scritto un post sul blog chiamato Come build URL di azioni assolute utilizzando la class UrlHelper in cui suggerisco di scrivere un metodo di estensione personalizzato per motivi di leggibilità:

 ///  /// 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 string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues = null) { string scheme = url.RequestContext.HttpContext.Request.Url.Scheme; return url.Action(actionName, controllerName, routeValues, scheme); } 

Puoi quindi semplicemente usarlo in questo modo nella tua vista:

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

Questo potrebbe essere solo per me essere davvero, davvero pignolo, ma mi piace definire costanti solo una volta. Se usi uno degli approcci sopra definiti, la tua costante d’azione sarà definita più volte.

Per evitare ciò, puoi fare quanto segue:

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

Quindi crea i tuoi controller, ad esempio, ad esempio DataController:

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

Quindi usalo come:

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

E dal tuo .cshtml (o da qualsiasi codice)

  

Questo è sicuramente molto più lavoro, ma resto tranquillo sapendo che la convalida del tempo di compilazione è dalla mia parte.

Questo è ciò che devi fare.

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

Stavo avendo un problema con questo, il mio server era in esecuzione dietro un sistema di bilanciamento del carico. Il servizio di bilanciamento del carico stava terminando la connessione SSL / TLS. Quindi ha passato la richiesta ai server web usando http.

Usando il metodo Url.Action () con Request.Url.Schema, continuava a creare un URL http, nel mio caso per creare un collegamento in un’e-mail automatica (che il mio PenTester non gradiva).

Potrei aver barato un po ‘, ma è esattamente quello di cui avevo bisogno per forzare un URL https:

 Click Here 

In realtà utilizzo un app di configurazione web.config in modo da poter utilizzare http durante il debug localmente, ma tutti gli ambienti di test e di produzione utilizzano la trasformazione per impostare il valore https.

Questa domanda è specifica per ASP.NET, ma sono sicuro che alcuni di voi potranno beneficiare del javascript agnostico di sistema che è utile in molte situazioni.

AGGIORNAMENTO: il modo per ottenere l’url formato al di fuori della pagina stessa è ben descritto nelle risposte sopra.

O potresti fare un oneliner come segue:

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

dal filtro o:

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

Tuttavia, molto spesso, è necessario ottenere l’url della pagina corrente, per quei casi che utilizzano Html.Action e mettere il suo nome e il controller della pagina in cui ti trovi mi sembra imbarazzante. Preferisco in questi casi utilizzare JavaScript. Questo è particolarmente buono nei sistemi che sono metà riscritti MVT mezzo web-form a metà script VB a metà Dio sa cosa – e per ottenere l’URL della pagina corrente è necessario utilizzare ogni volta un metodo diverso.

Un modo è usare JavaScript per ottenere l’URL è window.location.href another – document.URL