在控制器 .NET MVC 中创建 URL
Posted
技术标签:
【中文标题】在控制器 .NET MVC 中创建 URL【英文标题】:Creating a URL in the controller .NET MVC 【发布时间】:2009-03-31 02:17:51 【问题描述】:我需要能够在控制器上的 Action 中构造一个链接以发送电子邮件。这样做的最佳做法是什么?我不想自己构建它,以防我的路线发生变化。
我是否应该查看每封电子邮件并呈现并发送它?这可能是一个很好的方法。
【问题讨论】:
【参考方案1】:如果你只是想获取某个动作的路径,使用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);
【讨论】:
后续:对于倒数第二个参数(RouteValueDictionary)这里是一个例子:new System.Web.Routing.RouteValueDictionary(new id = 1 ) 你不需要构造一个新的UrlHelper;控制器上有一个 .Url 属性,它将为您提供正确的 RequestContext。 “根”从何而来?如果我必须硬编码我要匹配的路线的名称,为什么不直接硬编码 url? @xr280xr:我相信在这个例子中,“Root”是在 RegisterRoutes 方法中定义的路由名称(通常在 RouteConfig 中)。对我来说,它是“默认”(就像我创建项目时一样)。 你不需要新建一个 UrlHelper,只需访问 Controller 类中的 Url 属性。【参考方案2】:如果您需要完整的网址(例如通过电子邮件发送),请考虑使用以下内置方法之一:
这样您就可以创建用于构建 url 的路由:
Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(newcid=newop.CompanyID,oid=newop.ID), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)
这里的url是路由引擎判断正确后构建的:
Url.Action("Detail","Opinion",new RouteValueDictionary(newcid=newop.CompanyID,oid=newop.ID),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)
在这两种方法中,最后两个参数指定协议和主机名。
问候。
【讨论】:
仅供参考,使用Url.Action(action, controller, routevalue, protocol)
也会生成完整的 URL,因此如果不需要,您不必指定主机名。
我收到以下 URL,端口号加倍,请问我该如何解决? h t t p://localhost:54383:54383/MyArea/MyController/Details/1【参考方案3】:
我遇到了同样的问题,Gidon 的回答似乎有一个小缺陷:它会生成一个相对 URL,不能通过邮件发送。
我的解决方案如下所示:
string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new key = randomString );
这样会生成一个完整的 URL,即使应用程序在托管服务器上的深度有好几级,并且使用 80 以外的端口,它也能正常工作。
编辑:我发现this 也很有用。
【讨论】:
请注意,这有一个重大的安全漏洞。只需有人修改请求标头以包含作为主机的恶意 URL,您的应用程序就会发送一封官方电子邮件,其中包含指向危险网站的链接。【参考方案4】:另一种为动作创建绝对 URL 的方法:
var relativeUrl = Url.Action("MyAction"); //..or one of the other .Action() overloads
var currentUrl = Request.Url;
var absoluteUrl = new System.Uri(currentUrl, relativeUrl);
【讨论】:
【参考方案5】:我知道这是一个老问题,但如果您尝试在 ASP.NET Core 中做同样的事情,以下是如何在操作中创建 UrlHelper:
var urlHelper = new UrlHelper(this.ControllerContext);
或者,如果您从 Controller
继承,则可以只使用 Controller.Url
属性。
【讨论】:
以上是关于在控制器 .NET MVC 中创建 URL的主要内容,如果未能解决你的问题,请参考以下文章
在 JavaScript 中创建类并将其传递给 MVC 控制器的正确方法是啥
在 Spring mvc/rest 开发中创建控制器时对以下内容感到困惑:ModelAndView、Model、@ResponseBody、@ResponseEntity