Creazione di un URL nel controller MVC .NET


131

Devo essere in grado di costruire un collegamento nell'Azione sul controller per inviare un'e-mail. Qual è la migliore pratica per farlo? Non voglio costruirlo da solo nel caso in cui i miei percorsi cambino.

Dovrei avere una vista per ogni e-mail, renderlo e inviarlo? Potrebbe essere un buon modo per farlo.

Risposte:


230

Se vuoi solo ottenere il percorso per una determinata azione, usa UrlHelper:

UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("About", "Home", null);

se si desidera creare un collegamento ipertestuale:

string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext, System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", "Home", null, null);

Intellisense ti darà il significato di ciascuno dei parametri.


Aggiornamento dai commenti : il controller ha già un UrlHelper:

string url = this.Url.Action("About", "Home", null); 

17
Seguito: per il penultimo parametro (RouteValueDictionary) ecco un esempio: new System.Web.Routing.RouteValueDictionary (new {id = 1})
Matthew M.

15
Non è necessario costruire un nuovo UrlHelper; c'è una proprietà .Url sul controller che ti darà una con il RequestContext corretto.
Tobias J,

Da dove viene "Root"? Se devo codificare il nome del percorso che sto cercando di abbinare, perché non codificare l'URL?
xr280xr,

@ xr280xr: Credo che in questo esempio "Root" sia il nome della route come definito nel metodo RegisterRoutes (di solito in RouteConfig). Per me, era "Predefinito" (come lo era quando ho creato il mio progetto).
Andy,

3
Non è necessario rinnovare un UrlHelper, basta accedere alla proprietà Url nella classe Controller.
Jay Douglass,

22

Se hai bisogno dell'URL completo (ad esempio per inviare via e-mail), considera l'utilizzo di uno dei seguenti metodi integrati:

Con questo crei il percorso da utilizzare per creare l'URL:

Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

Qui l'URL viene creato dopo che il motore di route determina quello corretto:

Url.Action("Detail","Opinion",new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

In entrambi i metodi, gli ultimi 2 parametri specificano il protocollo e il nome host.

Saluti.


7
L'uso di FYI Url.Action(action, controller, routevalue, protocol)produce anche un URL completo, quindi non è necessario specificare il nome host se non è necessario.
Endy Tjahjono,

1
Ricevo il seguente URL con il numero di porta raddoppiato, come posso risolvere questo, per favore? http: // localhost: 54383: 54383 / MyArea / MyController / Dettagli / 1
Patee Gutee,

12

Ho avuto lo stesso problema e sembra che la risposta di Gidon abbia un piccolo difetto: genera un URL relativo, che non può essere inviato per posta.

La mia soluzione è simile a questa:

string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });

In questo modo, viene generato un URL completo e funziona anche se l'applicazione ha diversi livelli di profondità sul server di hosting e utilizza una porta diversa da 80.

EDIT: Ho trovato questo utile pure.


Si noti che ciò presenta un'importante vulnerabilità di sicurezza. Tutto ciò che serve è qualcuno che modifica l'intestazione della richiesta per contenere un URL dannoso come host e l'applicazione invierà un'e-mail ufficiale contenente un collegamento a un sito Web pericoloso.
V0ldek,

7

Un altro modo per creare un URL assoluto per un'azione:

var relativeUrl = Url.Action("MyAction");  //..or one of the other .Action() overloads
var currentUrl = Request.Url;

var absoluteUrl = new System.Uri(currentUrl, relativeUrl);

4

So che questa è una vecchia domanda, ma nel caso in cui tu stia provando a fare la stessa cosa in ASP.NET Core, ecco come puoi creare l'UrlHelper all'interno di un'azione:

var urlHelper = new UrlHelper(this.ControllerContext);

Oppure, puoi semplicemente utilizzare la Controller.Urlproprietà se erediti da Controller.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.