【发布时间】:2009-03-31 02:17:51
【问题描述】:
我需要能够在控制器上的 Action 中构造一个链接以发送电子邮件。这样做的最佳做法是什么?我不想自己构建它,以防我的路线发生变化。
我是否应该查看每封电子邮件并呈现并发送它?这可能是一个很好的方法。
【问题讨论】:
标签: asp.net asp.net-mvc
我需要能够在控制器上的 Action 中构造一个链接以发送电子邮件。这样做的最佳做法是什么?我不想自己构建它,以防我的路线发生变化。
我是否应该查看每封电子邮件并呈现并发送它?这可能是一个很好的方法。
【问题讨论】:
标签: asp.net asp.net-mvc
如果你只是想获取某个动作的路径,使用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 将为您提供每个参数的含义。
来自 cmets 的更新:控制器已经有一个 UrlHelper:
string url = this.Url.Action("About", "Home", null);
【讨论】:
如果您需要完整的网址(例如通过电子邮件发送),请考虑使用以下内置方法之一:
这样您就可以创建用于构建 url 的路由:
Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)
这里的url是路由引擎判断正确后构建的:
Url.Action("Detail","Opinion",new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)
在这两种方法中,最后两个参数指定协议和主机名。
问候。
【讨论】:
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 以外的端口,它也能正常工作。
编辑:我发现this 也很有用。
【讨论】:
另一种为动作创建绝对 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 属性。
【讨论】: