.NET MVC denetleyicisinde bir URL oluşturma


131

E-posta göndermek için denetleyicideki Eylemde bir bağlantı oluşturabilmem gerekiyor. Bunu yapmak için en iyi uygulama nedir? Rotalarımın değişmesi ihtimaline karşı kendim inşa etmek istemiyorum.

Her e-posta için bir görünüm almalı ve bunu oluşturup göndermeli miyim? Bunu yapmanın iyi bir yolu olabilir.

Yanıtlar:


230

Yalnızca belirli bir eyleme giden yolu öğrenmek istiyorsanız, şunu kullanın UrlHelper:

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

bir köprü oluşturmak istiyorsanız:

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

Intellisense size her bir parametrenin anlamını verecektir.


Yorumlardan güncelleme : denetleyicinin zaten bir UrlHelper:

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

17
Takip: İkinci ila son parametre (RouteValueDictionary) için burada bir örnek: new System.Web.Routing.RouteValueDictionary (new {id = 1})
Matthew M.

15
Yeni bir UrlHelper oluşturmanıza gerek yoktur; Denetleyicide size doğru RequestContext'i verecek bir .Url özelliği vardır.
Tobias J

"Kök" nereden geliyor? Eşleştirmeye çalıştığım rotanın adını sabit kodlamam gerekirse, neden sadece url'yi kodlamayayım?
xr280xr

@ xr280xr: Bu örnekte "Kök" ün, RegisterRoutes yönteminde (genellikle RouteConfig'de) tanımlandığı şekliyle yolun adı olduğuna inanıyorum. Benim için bu "Varsayılan" idi (projemi oluşturduğumdaki gibi).
Andy

3
Bir UrlHelper'ı yenilemenize gerek yoktur, sadece Controller sınıfındaki Url özelliğine erişin.
Jay Douglass

22

Tam url'ye ihtiyacınız varsa (örneğin, e-postayla göndermek için) aşağıdaki yerleşik yöntemlerden birini kullanmayı düşünün:

Bununla, url'yi oluşturmak için kullanılacak rotayı oluşturursunuz:

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

Burada URL, rota motoru doğru olanı belirledikten sonra oluşturulur:

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

Her iki yöntemde de son 2 parametre protokolü ve ana bilgisayar adını belirtir.

Saygılarımızla.


7
Bilginize kullanmak Url.Action(action, controller, routevalue, protocol)ayrıca tam URL üretir, bu nedenle ihtiyacınız yoksa ana bilgisayar adını belirtmeniz gerekmez.
Endy Tjahjono

1
Bağlantı noktası numarası iki katına çıkmış aşağıdaki URL'yi alıyorum, lütfen bunu nasıl düzeltebilirim? http: // localhost: 54383: 54383 / MyArea / MyController / Ayrıntılar / 1
Patee Gutee

12

Aynı sorunu yaşadım ve görünüşe göre Gidon'un cevabının küçük bir kusuru var: postayla gönderilemeyen göreli bir URL oluşturuyor.

Çözümüm şuna benziyor:

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

Bu şekilde, tam bir URL oluşturulur ve uygulama, barındırma sunucusunda birkaç düzey derinlikte olsa ve 80'den farklı bir bağlantı noktası kullansa bile çalışır.

DÜZENLEME: buldum bu sıra kullanışlı.


Lütfen bunun büyük bir güvenlik açığı olduğunu unutmayın. Tek yapmanız gereken, istek başlığını ana bilgisayar olarak kötü amaçlı bir URL içerecek şekilde değiştirmektir ve uygulamanız tehlikeli bir web sitesine bağlantı içeren resmi bir e-posta gönderecektir.
V0ldek

7

Bir eyleme mutlak bir URL oluşturmanın başka bir yolu:

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

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

4

Bunun eski bir soru olduğunu biliyorum, ancak aynı şeyi ASP.NET Core'da yapmaya çalışıyorsanız, işte UrlHelper'ı bir eylem içinde nasıl oluşturabileceğiniz:

var urlHelper = new UrlHelper(this.ControllerContext);

Veya Controller.Urlmiras alıyorsanız mülkü kullanabilirsiniz Controller.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.