在控制器 .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 控制器的正确方法是啥

在 MVC 中创建具有上下文的控制器时如何省略视图的生成?

MVC .NET 表单提交未命中控制器操作

从 ASP.NET MVC 操作中获取绝对 URL

在 Spring mvc/rest 开发中创建控制器时对以下内容感到困惑:ModelAndView、Model、@ResponseBody、@ResponseEntity

如何在 MVC 中创建共享视图