ฉันต้องสามารถสร้างลิงค์ใน Action บนคอนโทรลเลอร์เพื่อส่งอีเมลได้ แนวทางปฏิบัติที่ดีที่สุดในการทำสิ่งนี้คืออะไร? ฉันไม่ต้องการสร้างมันเองในกรณีที่เส้นทางของฉันเปลี่ยนไป
ฉันควรดูอีเมลแต่ละฉบับและแสดงผลและส่งหรือไม่ นั่นอาจเป็นวิธีที่ดีในการทำ
ฉันต้องสามารถสร้างลิงค์ใน Action บนคอนโทรลเลอร์เพื่อส่งอีเมลได้ แนวทางปฏิบัติที่ดีที่สุดในการทำสิ่งนี้คืออะไร? ฉันไม่ต้องการสร้างมันเองในกรณีที่เส้นทางของฉันเปลี่ยนไป
ฉันควรดูอีเมลแต่ละฉบับและแสดงผลและส่งหรือไม่ นั่นอาจเป็นวิธีที่ดีในการทำ
คำตอบ:
หากคุณต้องการเพียงแค่ได้รับเส้นทางไปยังการกระทำบางอย่างให้ใช้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);
หากคุณต้องการ 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 ตัวสุดท้ายระบุโปรโตคอลและชื่อโฮสต์
ความนับถือ.
Url.Action(action, controller, routevalue, protocol)
ยังสร้าง URL แบบเต็มดังนั้นคุณไม่จำเป็นต้องระบุชื่อโฮสต์หากคุณไม่ต้องการ
ฉันมีปัญหาเดียวกันและดูเหมือนว่าคำตอบของ Gidon มีข้อบกพร่องเล็กน้อยคือสร้าง URL สัมพัทธ์ซึ่งไม่สามารถส่งทางไปรษณีย์ได้
ทางออกของฉันมีลักษณะดังนี้:
string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });
ด้วยวิธีนี้จะสร้าง URL แบบเต็มและใช้งานได้แม้ว่าแอปพลิเคชันจะอยู่ลึกลงไปหลายระดับบนเซิร์ฟเวอร์โฮสติ้งและใช้พอร์ตอื่นที่ไม่ใช่ 80
แก้ไข: ฉันพบว่าสิ่งนี้มีประโยชน์เช่นกัน
อีกวิธีในการสร้าง URL ที่สมบูรณ์สำหรับการดำเนินการ:
var relativeUrl = Url.Action("MyAction"); //..or one of the other .Action() overloads
var currentUrl = Request.Url;
var absoluteUrl = new System.Uri(currentUrl, relativeUrl);
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ในกรณีที่คุณพยายามทำสิ่งเดียวกันใน ASP.NET Core นี่คือวิธีที่คุณสามารถสร้าง UrlHelper ภายในการดำเนินการ:
var urlHelper = new UrlHelper(this.ControllerContext);
หรือคุณก็สามารถใช้คุณสมบัติถ้าคุณได้รับมรดกจากController.Url
Controller