在控制器.NET MVC中创建URL

时间:2009-03-31 02:17:52

标签: asp.net asp.net-mvc

我需要能够在控制器上的Action中构建一个链接来发送电子邮件。这样做的最佳做法是什么?如果我的路线发生变化,我不想自己构建它。

我是否应该查看每封电子邮件并进行渲染并发送?这可能是一种很好的方式。

5 个答案:

答案 0 :(得分:214)

如果您只想获得某个操作的路径,请使用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); 

答案 1 :(得分:21)

如果您需要完整的网址(例如通过电子邮件发送),请考虑使用以下内置方法之一:

通过这个你修复de route用于build de url:

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

这里的url是在路由引擎确定de correct之后构建的:

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

在这两种方法中,最后2个参数指定协议和主机名。

问候。

答案 2 :(得分:12)

我有同样的问题,看来Gidon的答案有一个小缺陷:它生成一个相对的URL,不能通过邮件发送。

我的解决方案如下:

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

这样就生成了一个完整的URL,即使应用程序在托管服务器上有多个级别,并且使用80以外的端口,它也能正常工作。

编辑:我发现this也很有用。

答案 3 :(得分:6)

为操作创建绝对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 :(得分:3)

我知道这是一个老问题,但是如果你想在ASP.NET Core中做同样的事情,这里是你如何在一个动作中创建UrlHelper:

var urlHelper = new UrlHelper(this.ControllerContext);

或者,如果您从Controller.Url继承,则可以使用Controller属性。