2009-03-31 4 views
103

Je dois pouvoir construire un lien dans l'action sur le contrôleur pour envoyer un email. Quelle est la meilleure pratique pour le faire? Je ne veux pas le construire moi-même au cas où mes routes changeraient.Création d'une URL dans le contrôleur .NET MVC

Dois-je avoir un affichage pour chaque e-mail et le rendre et l'envoyer? Ce pourrait être un bon moyen de le faire.

Répondre

196

Si vous voulez juste pour obtenir le chemin d'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 chaque des paramètres.


Mise à jour des commentaires: contrôleur a déjà UrlHelper:

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

Followup: Pour la deuxième au dernier paramètre (RouteValueDictionary) voici un exemple: nouveau System.Web.Routing.RouteValueDictionary (nouveau {id = 1}) –

+13

Vous n'avez pas besoin de construire un nouveau UrlHelper; il y a une propriété .Url sur le contrôleur qui vous donnera un avec le RequestContext correct. –

+0

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 coder en dur l'URL? – xr280xr

10

J'ai eu le même problème, et il semble la réponse de Gidon a une faille minuscule: il génère une URL relative, qui ne peut pas être envoyé 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é this utile aussi bien.

19

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

Avec ce vous fixez de la route à utiliser pour construire de 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 construit après que le moteur d'itinéraire déterminer de corriger une:

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 indique le protocole et le nom d'hôte.

Cordialement.

+6

FYI en utilisant 'Url.Action (action, controller, routevalue, protocol)' produit aussi une URL complète, donc vous n'avez pas besoin de spécifier le nom d'hôte si vous n'en avez pas besoin. –

3

Une autre façon de créer une URL absolue à 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); 
0

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

var urlHelper = new UrlHelper(this.ControllerContext); 

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

Questions connexes