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

131

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

Dois-je avoir une vue pour chaque e-mail, le rendre et l'envoyer? Cela pourrait être une bonne façon de procéder.

ScottBelchak
la source

Réponses:

230

Si vous souhaitez simplement obtenir le chemin vers une certaine action, utilisez UrlHelper:

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

si vous souhaitez 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 des commentaires : le contrôleur a déjà un UrlHelper:

string url = this.Url.Action("About", "Home", null); 
Gidon
la source
17
Followup: Pour l'avant-dernier paramètre (le RouteValueDictionary), voici un exemple: new System.Web.Routing.RouteValueDictionary (new {id = 1})
Matthew M.
15
Vous n'avez pas besoin de construire un nouveau UrlHelper; il existe une propriété .Url sur le contrôleur qui vous en donnera une avec le RequestContext correct.
Tobias J
D'où vient "Root"? Si je dois coder en dur le nom de l'itinéraire que j'essaie de faire correspondre, pourquoi ne pas simplement coder en dur l'URL?
xr280xr
@ xr280xr: Je crois que dans cet exemple "Root" est le nom de l'itinéraire tel que défini dans la méthode RegisterRoutes (généralement dans RouteConfig). Pour moi, c'était "Default" (comme c'était quand j'ai créé mon projet).
Andy
3
Vous n'avez pas besoin de créer un nouveau UrlHelper, accédez simplement à la propriété Url dans la classe Controller.
Jay Douglass
22

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

Avec cela, vous créez l'itinéraire à utiliser pour créer 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 d'itinéraire a déterminé 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.

andresfiuba
la source
7
Pour info, l'utilisation Url.Action(action, controller, routevalue, protocol)produit également une URL complète, vous n'avez donc pas à spécifier le nom d'hôte si vous n'en avez pas besoin.
Endy Tjahjono
1
J'obtiens l'URL suivante avec le numéro de port doublé. Comment résoudre ce problème s'il vous plaît? http: // localhost: 54383: 54383 / MyArea / MyController / Details / 1
Patee Gutee
12

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

Ma solution ressemble à ceci:

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

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

EDIT: J'ai trouvé cela utile aussi.

Moshe
la source
Veuillez noter que cela présente une vulnérabilité de sécurité majeure. Tout ce qu'il faudrait, c'est que quelqu'un modifie l'en-tête de la demande pour contenir une URL malveillante en tant qu'hôte et votre application enverrait un e-mail officiel contenant un lien vers un site Web dangereux.
V0ldek
7

Une autre façon de créer une URL absolue vers 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);
Sphinxxx
la source
4

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 vous pouvez créer UrlHelper dans une action:

var urlHelper = new UrlHelper(this.ControllerContext);

Ou, vous pouvez simplement utiliser la Controller.Urlpropriété si vous héritez de Controller.

Darren
la source