在控制器.NET MVC中创建URL


131

我需要能够在控制器上的Action中构造一个链接以发送电子邮件。最佳做法是什么?我不想自己构造它以防我的路线改变。

我应该查看每封电子邮件的视图并将其呈现并发送吗?那可能是个好方法。

Answers:


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
后续:对于倒数第二个参数(RouteValueDictionary),下面是一个示例:new System.Web.Routing.RouteValueDictionary(new {id = 1})
Matthew M.

15
您不需要构造新的UrlHelper;控制器上有一个.Url属性,可以为您提供正确的RequestContext。
Tobias J

“根”来自哪里?如果必须对要匹配的路由名称进行硬编码,为什么不对URL进行硬编码呢?
xr280xr 2014年

@ xr280xr:我相信在此示例中,“ Root”是在RegisterRoutes方法(通常在RouteConfig中)中定义的路由的名称。对我来说,它是“默认”(与创建项目时一样)。
安迪

3
您无需更新UrlHelper,只需访问Controller类中的Url属性即可。
杰伊·道格拉斯

22

如果您需要完整的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
仅供参考,Url.Action(action, controller, routevalue, protocol)还会产生完整的URL,因此不需要时无需指定主机名。
Endy Tjahjono 2012年

1
我收到以下URL,端口号加倍,如何解决此问题?http:// localhost:54383:54383 / MyArea / MyController / Details / 1
Patee Gutee

12

我遇到了同样的问题,看来Gidon的答案有一个小缺陷:它生成一个相对URL,该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.Url如果您继承自,则可以只使用该属性Controller

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.