在控制器.NETMVC 中创建 URL

我需要能够建立一个在控制器上的行动链接发送电子邮件。这样做的最佳实践是什么?我不想自己动手,以防路线改变。

我应该为每个电子邮件有一个视图,并渲染和发送它?这也许是个好办法。

111408 次浏览

如果你只是想得到一个特定动作的路径,使用 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);

智能感知将为您提供每个参数的含义。


注释更新 : 控制器已经有一个 UrlHelper:

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

我也遇到过同样的问题,吉登的回答似乎有一个小小的缺陷: 它会生成一个相对 URL,无法通过邮件发送。

我的解决方案是这样的:

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

这样,就会生成一个完整的 URL,即使应用程序位于宿主服务器的几个层次上,并且使用80以外的端口,它也能正常工作。

编辑: 我发现 这个也很有用。

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

这样,您就可以创建用于构建 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)

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

问候。

创建操作的绝对 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继承,可以只使用 Controller.Url属性。