Erstellen einer URL im Controller .NET MVC

131

Ich muss in der Lage sein, einen Link in der Aktion auf dem Controller zu erstellen, um eine E-Mail zu senden. Was ist die beste Vorgehensweise, um dies zu tun? Ich möchte es nicht selbst konstruieren, falls sich meine Routen ändern.

Sollte ich für jede E-Mail eine Ansicht haben und diese rendern und senden? Das könnte ein guter Weg sein, es zu tun.

ScottBelchak
quelle

Antworten:

230

Wenn Sie nur den Pfad zu einer bestimmten Aktion erhalten möchten, verwenden Sie UrlHelper:

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

Wenn Sie einen Hyperlink erstellen möchten:

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

Intellisense gibt Ihnen die Bedeutung der einzelnen Parameter.


Update aus Kommentaren : Controller hat bereits ein UrlHelper:

string url = this.Url.Action("About", "Home", null); 
Gidon
quelle
17
Follow-up: Für den vorletzten Parameter (das RouteValueDictionary) hier ein Beispiel: neues System.Web.Routing.RouteValueDictionary (neues {id = 1})
Matthew M.
15
Sie müssen keinen neuen UrlHelper erstellen. Auf dem Controller befindet sich eine .Url-Eigenschaft, die Ihnen eine mit dem richtigen RequestContext gibt.
Tobias J
Woher kommt "Root"? Wenn ich den Namen der Route, mit der ich übereinstimmen möchte, fest codieren muss, warum nicht einfach die URL fest codieren?
xr280xr
@ xr280xr: Ich glaube in diesem Beispiel "Root" ist der Name der Route, wie in der RegisterRoutes-Methode definiert (normalerweise in RouteConfig). Für mich war es "Standard" (wie bei der Erstellung meines Projekts).
Andy
3
Sie müssen keinen UrlHelper neu erstellen, sondern greifen einfach auf die Url-Eigenschaft in der Controller-Klasse zu.
Jay Douglass
22

Wenn Sie die vollständige URL benötigen (z. B. zum Senden per E-Mail), sollten Sie eine der folgenden integrierten Methoden verwenden:

Damit erstellen Sie die Route zum Erstellen der URL:

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

Hier wird die URL erstellt, nachdem die Routen-Engine die richtige ermittelt hat:

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

Bei beiden Methoden geben die letzten beiden Parameter das Protokoll und den Hostnamen an.

Grüße.

andresfiuba
quelle
7
Zu Url.Action(action, controller, routevalue, protocol)Ihrer Information wird auch die vollständige URL erstellt, sodass Sie keinen Hostnamen angeben müssen, wenn Sie dies nicht benötigen.
Endy Tjahjono
1
Ich erhalte die folgende URL mit doppelter Portnummer. Wie behebe ich das bitte? http: // localhost: 54383: 54383 / MyArea / MyController / Details / 1
Patee Gutee
12

Ich hatte das gleiche Problem und es scheint, dass Gidons Antwort einen winzigen Fehler aufweist: Sie generiert eine relative URL, die nicht per Post gesendet werden kann.

Meine Lösung sieht folgendermaßen aus:

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

Auf diese Weise wird eine vollständige URL generiert, die auch dann funktioniert, wenn sich die Anwendung auf dem Hosting-Server auf mehreren Ebenen befindet und einen anderen Port als 80 verwendet.

EDIT: Ich fand das auch nützlich.

Moshe
quelle
Bitte beachten Sie, dass dies eine große Sicherheitslücke aufweist. Es ist lediglich erforderlich, dass jemand den Anforderungsheader so ändert, dass er eine schädliche URL als Host enthält, und Ihre Anwendung eine offizielle E-Mail mit einem Link zu einer gefährlichen Website sendet.
V0ldek
7

Eine andere Möglichkeit, eine absolute URL zu einer Aktion zu erstellen:

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

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

Ich weiß, dass dies eine alte Frage ist, aber nur für den Fall, dass Sie versuchen, dasselbe in ASP.NET Core zu tun, können Sie den UrlHelper wie folgt in einer Aktion erstellen:

var urlHelper = new UrlHelper(this.ControllerContext);

Oder Sie können die Controller.UrlEigenschaft einfach verwenden, wenn Sie von erben Controller.

Darren
quelle