web-dev-qa-db-fra.com

Création d'une URL dans le contrôleur .NET MVC

Je dois pouvoir créer un lien dans l'action sur le contrôleur pour envoyer un courrier électronique. Quelle est la meilleure pratique pour ce faire? Je ne veux pas le construire moi-même au cas où mes itinéraires changeraient.

Devrais-je avoir une vue pour chaque email et le rendre et l'envoyer? Cela pourrait être un bon moyen de le faire.

120
ScottBelchak

Si vous voulez juste obtenir le chemin d'une action donnée, utilisez UrlHelper:

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

si vous voulez créer un lien hypertexte:

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

Intellisense vous donnera la signification de chacun des paramètres.


Mise à jour à partir de commentaires: le contrôleur a déjà un UrlHelper:

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

Si vous avez besoin de l'URL complète (par exemple, pour l'envoyer par courrier électronique), envisagez d'utiliser l'une des méthodes intégrées suivantes:

Avec cela, vous créez la route à utiliser pour construire l'URL:

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

Ici l'URL est construite après que le moteur de route détermine la bonne:

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

Dans les deux méthodes, les 2 derniers paramètres spécifient le protocole et le nom d'hôte.

Cordialement.

21
andresfiuba

J'ai eu le même problème, et il semble que la réponse de Gidon présente un petit défaut: elle génère une URL relative, qui ne peut pas être envoyée par courrier électronique.

Ma solution ressemble à ceci:

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

De cette manière, une URL complète est générée et fonctionne même si l'application est située à plusieurs niveaux sur le serveur d'hébergement et utilise un port autre que 80.

EDIT: J'ai trouvé this utile aussi.

12
Moshe

Une autre façon de créer une URL absolue pour une action:

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

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

Je sais que c’est une vieille question, mais juste au cas où vous essayez de faire la même chose dans ASP.NET Core, voici comment créer le UrlHelper dans une action:

var urlHelper = new UrlHelper(this.ControllerContext);

Ou, vous pouvez simplement utiliser le Controller.Url propriété si vous héritez de Controller.

3
Darren