关于asp.net:在控制器.NET MVC中创建一个URL

Creating a URL in the controller .NET MVC

我需要能够在控制器的操作中构造一个链接来发送电子邮件。最佳实践是什么?我不想自己建造它以防我的路线改变。

我应该为每封电子邮件都有一个视图,并将其呈现并发送吗?这可能是一个很好的方法。


如果您只想获得某个操作的路径,请使用UrlHelper

1
2
UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("About","Home", null);

如果要创建超链接:

1
string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext, System.Web.Routing.RouteTable.Routes,"My link","Root","About","Home", null, null);

IntelliSense将为您提供每个参数的含义。

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

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


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

使用此选项,可以修复用于构建de url的de route:

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

在这里,URL是在路由引擎确定错误后生成的:

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

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

当做。


我也有同样的问题,似乎Gidon的回答有一个小小的缺陷:它生成了一个相对的URL,不能通过邮件发送。

我的解决方案如下:

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

这样就生成了一个完整的URL,即使应用程序在宿主服务器上有多个层次,并且使用的端口不是80,它也可以工作。

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


创建操作绝对URL的另一种方法:

1
2
3
4
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核心中执行相同的操作,下面介绍如何在操作中创建urlhelper:

1
var urlHelper = new UrlHelper(this.ControllerContext);

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