Tạo một URL trong bộ điều khiển .NET MVC


131

Tôi cần có khả năng xây dựng một liên kết trong Hành động trên bộ điều khiển để gửi email. Thực hành tốt nhất để làm điều này là gì? Tôi không muốn tự xây dựng nó trong trường hợp tuyến đường của tôi thay đổi.

Tôi có nên có một cái nhìn cho mỗi email và kết xuất nó và gửi nó không? Đó có thể là một cách tốt để làm điều đó.

Câu trả lời:


230

Nếu bạn chỉ muốn nhận đường dẫn đến một hành động nhất định, hãy sử dụng UrlHelper:

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

nếu bạn muốn tạo một siêu liên kết:

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

Intellisense sẽ cung cấp cho bạn ý nghĩa của từng tham số.


Cập nhật từ ý kiến : bộ điều khiển đã có UrlHelper:

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

17
Theo dõi: Đối với tham số thứ hai đến cuối cùng (RouteValueDixi) ở đây là một ví dụ: new System.Web.Routing.RouteValueDixi (new {id = 1})
Matthew M.

15
Bạn không cần phải xây dựng một UrlHelper mới; có một thuộc tính .Url trên bộ điều khiển sẽ cung cấp cho bạn một thuộc tính với RequestContext chính xác.
Tobias J

"Root" đến từ đâu? Nếu tôi phải mã hóa tên của tuyến đường tôi đang cố gắng khớp, tại sao không chỉ mã hóa url?
xr280xr

@ xr280xr: Tôi tin vào ví dụ này "Root" là tên của tuyến đường như được định nghĩa trong phương thức RegisterRoutes (thường là trong RouteConfig). Đối với tôi, đó là "Mặc định" (như khi tôi tạo dự án của mình).
Andy

3
Bạn không cần phải tạo UrlHelper mới, chỉ cần truy cập thuộc tính Url trong lớp Trình điều khiển.
Jay Doulass

22

Nếu bạn cần url đầy đủ (ví dụ để gửi qua email), hãy xem xét sử dụng một trong các phương thức tích hợp sau:

Với điều này, bạn tạo tuyến đường để sử dụng để xây dựng url:

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

Ở đây url được xây dựng sau khi công cụ định tuyến xác định đúng:

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

Trong cả hai phương thức, 2 tham số cuối cùng chỉ định giao thức và tên máy chủ.

Trân trọng.


7
FYI sử dụng Url.Action(action, controller, routevalue, protocol)cũng tạo ra URL đầy đủ, vì vậy bạn không phải chỉ định tên máy chủ nếu bạn không cần.
Endy Tjahjono

1
Tôi nhận được URL sau với số cổng được nhân đôi, làm cách nào để sửa lỗi này? http: // localhost: 54383: 54383 / MyArea / MyContoder / Chi tiết / 1
Patee Gutee

12

Tôi đã có cùng một vấn đề và có vẻ như câu trả lời của Gidon có một lỗ hổng nhỏ: nó tạo ra một URL tương đối, không thể gửi qua thư.

Giải pháp của tôi trông như thế này:

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

Bằng cách này, một URL đầy đủ được tạo và nó hoạt động ngay cả khi ứng dụng nằm sâu một vài cấp trên máy chủ lưu trữ và sử dụng một cổng khác ngoài 80.

EDIT: Tôi thấy điều này cũng hữu ích.


Xin lưu ý rằng điều này có một lỗ hổng bảo mật lớn. Tất cả những gì bạn cần là sửa đổi tiêu đề yêu cầu để chứa URL độc hại vì máy chủ lưu trữ và ứng dụng của bạn sẽ gửi email chính thức chứa liên kết đến một trang web nguy hiểm.
V0ldek

7

Một cách khác để tạo một URL tuyệt đối cho một hành động:

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

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

4

Tôi biết đây là một câu hỏi cũ, nhưng chỉ trong trường hợp bạn đang cố gắng làm điều tương tự trong ASP.NET Core, đây là cách bạn có thể tạo UrlHelper trong một hành động:

var urlHelper = new UrlHelper(this.ControllerContext);

Hoặc, bạn chỉ có thể sử dụng Controller.Urltài sản nếu bạn thừa kế từ Controller.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.