การสร้าง URL ในคอนโทรลเลอร์. NET MVC


131

ฉันต้องสามารถสร้างลิงค์ใน Action บนคอนโทรลเลอร์เพื่อส่งอีเมลได้ แนวทางปฏิบัติที่ดีที่สุดในการทำสิ่งนี้คืออะไร? ฉันไม่ต้องการสร้างมันเองในกรณีที่เส้นทางของฉันเปลี่ยนไป

ฉันควรดูอีเมลแต่ละฉบับและแสดงผลและส่งหรือไม่ นั่นอาจเป็นวิธีที่ดีในการทำ

คำตอบ:


230

หากคุณต้องการเพียงแค่ได้รับเส้นทางไปยังการกระทำบางอย่างให้ใช้UrlHelper:

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

หากคุณต้องการสร้างไฮเปอร์ลิงก์:

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

Intellisense จะให้ความหมายของแต่ละพารามิเตอร์


อัปเดตจากความคิดเห็น : คอนโทรลเลอร์มีUrlHelper:

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

17
Followup: สำหรับพารามิเตอร์ที่สองถึงสุดท้าย (RouteValueDictionary) นี่คือตัวอย่าง: System.Web.Routing.RouteValueDictionary (ใหม่ {id = 1})
Matthew M.

15
คุณไม่จำเป็นต้องสร้าง UrlHelper ใหม่ มีคุณสมบัติ. url บนคอนโทรลเลอร์ซึ่งจะทำให้คุณมี RequestContext ที่ถูกต้อง
Tobias J

"ราก" มาจากไหน? ถ้าฉันต้องฮาร์ดโค้ดชื่อเส้นทางที่พยายามจับคู่ทำไมไม่ฮาร์ดโค้ด URL ล่ะ
xr280xr

@ xr280xr: ฉันเชื่อในตัวอย่างนี้ "Root" เป็นชื่อของเส้นทางตามที่กำหนดในเมธอด RegisterRoutes (โดยปกติจะอยู่ใน RouteConfig) สำหรับฉันมันเป็น "ค่าเริ่มต้น" (เหมือนตอนที่สร้างโครงการ)
Andy

3
คุณไม่จำเป็นต้องสร้าง UrlHelper ใหม่เพียงแค่เข้าถึงคุณสมบัติ Url ในคลาส Controller
Jay Douglass

22

หากคุณต้องการ url แบบเต็ม (ตัวอย่างเช่นในการส่งทางอีเมล) ให้ลองใช้หนึ่งในวิธีการในตัวต่อไปนี้:

ด้วยวิธีนี้คุณสร้างเส้นทางเพื่อใช้สร้าง url:

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

ที่นี่ URL ถูกสร้างขึ้นหลังจากที่เอ็นจิ้นเส้นทางกำหนด URL ที่ถูกต้อง:

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

ในทั้งสองวิธีพารามิเตอร์ 2 ตัวสุดท้ายระบุโปรโตคอลและชื่อโฮสต์

ความนับถือ.


7
FYI ใช้Url.Action(action, controller, routevalue, protocol)ยังสร้าง URL แบบเต็มดังนั้นคุณไม่จำเป็นต้องระบุชื่อโฮสต์หากคุณไม่ต้องการ
Endy Tjahjono

1
ฉันได้รับ URL ต่อไปนี้พร้อมหมายเลขพอร์ตเพิ่มขึ้นเป็นสองเท่าฉันจะแก้ไขสิ่งนี้ได้อย่างไร http: // localhost: 54383: 54383 / MyArea / MyController / Details / 1
Patee Gutee

12

ฉันมีปัญหาเดียวกันและดูเหมือนว่าคำตอบของ Gidon มีข้อบกพร่องเล็กน้อยคือสร้าง URL สัมพัทธ์ซึ่งไม่สามารถส่งทางไปรษณีย์ได้

ทางออกของฉันมีลักษณะดังนี้:

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

ด้วยวิธีนี้จะสร้าง URL แบบเต็มและใช้งานได้แม้ว่าแอปพลิเคชันจะอยู่ลึกลงไปหลายระดับบนเซิร์ฟเวอร์โฮสติ้งและใช้พอร์ตอื่นที่ไม่ใช่ 80

แก้ไข: ฉันพบว่าสิ่งนี้มีประโยชน์เช่นกัน


โปรดทราบว่าสิ่งนี้มีช่องโหว่ด้านความปลอดภัยที่สำคัญ สิ่งที่ต้องทำก็คือมีคนแก้ไขส่วนหัวของคำขอให้มี URL ที่เป็นอันตรายเป็นโฮสต์และแอปพลิเคชันของคุณจะส่งอีเมลอย่างเป็นทางการที่มีลิงก์ไปยังเว็บไซต์อันตราย
V0ldek

7

อีกวิธีในการสร้าง URL ที่สมบูรณ์สำหรับการดำเนินการ:

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

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

4

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ในกรณีที่คุณพยายามทำสิ่งเดียวกันใน ASP.NET Core นี่คือวิธีที่คุณสามารถสร้าง UrlHelper ภายในการดำเนินการ:

var urlHelper = new UrlHelper(this.ControllerContext);

หรือคุณก็สามารถใช้คุณสมบัติถ้าคุณได้รับมรดกจากController.UrlController

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.