在ASP.NET MVC中获取完整的URL地址

是否有内置的方式来获取完整的url?

我正在寻找像GetFullUrl("Action", "Controller") ,将返回像http://www.fred.com/Controller/Action

我寻找这个的原因是为了避免在生成的自动电子邮件中对url进行硬编码,这样就可以始终相对于网站的当前位置生成url。

Url.Action有一个重载,它将所需的协议(例如http,https)作为参数 – 如果指定了此参数,则会获得完全限定的URL。

以下是一个在操作方法中使用当前请求协议的示例:

 var fullUrl = this.Url.Action("Edit", "Posts", new { id = 5 }, this.Request.Url.Scheme); 

HtmlHelper(@Html)也有一个ActionLink方法的重载,您可以在剃刀中使用该方法创build一个锚点元素,但是它也需要hostName和fragment参数。 所以我只是select再次使用@ Url.Action:

 <span> Copy <a href='@Url.Action("About", "Home", null, Request.Url.Scheme)'>this link</a> and post it anywhere on the internet! </span> 

正如Paddy所说: 如果使用明确指定要使用的协议的UrlHelper.Action()的重载,则生成的URL将是绝对的并且是完全限定的,而不是相对的。

我写了一篇名为“ 如何使用UrlHelper类构build绝对操作URL”的博客文章,其中为了便于阅读,我build议编写自定义扩展方法:

 /// <summary> /// Generates a fully qualified URL to an action method by using /// the specified action name, controller name and route values. /// </summary> /// <param name="url">The URL helper.</param> /// <param name="actionName">The name of the action method.</param> /// <param name="controllerName">The name of the controller.</param> /// <param name="routeValues">The route values.</param> /// <returns>The absolute URL.</returns> public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues = null) { string scheme = url.RequestContext.HttpContext.Request.Url.Scheme; return url.Action(actionName, controllerName, routeValues, scheme); } 

那么你可以简单地在你的视图中使用它:

 @Url.AbsoluteAction("Action", "Controller") 

这是你需要做的。

 @Url.Action(action,controller, null, Request.Url.Scheme) 

这可能只是我真的很挑剔,但我喜欢只定义一次常量。 如果你使用上面定义的任何方法,你的动作常量将被定义多次。

为了避免这种情况,您可以执行以下操作:

  public class Url { public string LocalUrl { get; } public Url(string localUrl) { LocalUrl = localUrl; } public override string ToString() { return LocalUrl; } } public abstract class Controller { public Url RootAction => new Url(GetUrl()); protected abstract string Root { get; } public Url BuildAction(string actionName) { var localUrl = GetUrl() + "/" + actionName; return new Url(localUrl); } private string GetUrl() { if (Root == "") { return ""; } return "/" + Root; } public override string ToString() { return GetUrl(); } } 

然后创build你的控制器,比如说DataController:

  public static readonly DataController Data = new DataController(); public class DataController : Controller { public const string DogAction = "dog"; public const string CatAction = "cat"; public const string TurtleAction = "turtle"; protected override string Root => "data"; public Url Dog => BuildAction(DogAction); public Url Cat => BuildAction(CatAction); public Url Turtle => BuildAction(TurtleAction); } 

然后就像使用它:

  // GET: Data/Cat [ActionName(ControllerRoutes.DataController.CatAction)] public ActionResult Etisys() { return View(); } 

并从您的.cshtml(或任何代码)

 <ul> <li><a href="@ControllerRoutes.Data.Dog">Dog</a></li> <li><a href="@ControllerRoutes.Data.Cat">Cat</a></li> </ul> 

这绝对是更多的工作,但我知道编译时validation在我身边,我很容易。

我遇到了这个问题,我的服务器运行在负载均衡器后面。 负载均衡器正在终止SSL / TLS连接。 然后使用http将请求传递给Web服务器。

使用Url.Action()方法与Request.Url.Schema,它不断创build一个http url,在我的情况下创build一个自动化的电子邮件(我的PenTester不喜欢)的链接。

我可能已经欺骗了一点,但这正是我需要强制一个httpsurl:

 <a href="@Url.Action("Action", "Controller", new { id = Model.Id }, "https")">Click Here</a> 

我实际上使用web.config AppSetting,以便在本地debugging时使用http,但所有testing和产品环境都使用转换来设置https值。

这个问题是特定于ASP .NET,但我相信你们中的一些人将受益于系统不可知的JavaScript在许多情况下是有利的。

更新:在上面的答案中很好地描述了在页面之外形成url的方式。

或者你可以做一个像下面这样的oneliner:

 new UrlHelper(actionExecutingContext.RequestContext).Action( "SessionTimeout", "Home", new {area = string.Empty}, actionExecutingContext.Request.Url!= null? actionExecutingContext.Request.Url.Scheme : "http" ); 

从filter或:

 new UrlHelper(this.Request.RequestContext).Action( "Details", "Journey", new { area = productType }, this.Request.Url!= null? this.Request.Url.Scheme : "http" ); 

然而,经常需要获取当前页面的url,对于那些使用Html.Action并且把他对我的页面名称和控制器感到尴尬。 在这种情况下,我的首选是使用JavaScript代替。 这是在一半重写的系统MVT半webforms一半vb脚本一半天知道什么 – 并获得当前页面的URL每个需要使用不同的方法每一次。

一种方法是使用JavaScript来获取URL是window.location.href另一个 – document.URL