在ASP中获取完整的URL。NET MVC

是否有一个内置的方式来获得一个动作的完整URL ?

我正在寻找类似GetFullUrl("Action", "Controller")的东西,它将返回类似http://www.fred.com/Controller/Action的东西。

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

320102 次浏览

Url重载。将您想要的协议(例如http, https)作为参数的操作-如果您指定了这个,您将得到一个完全限定的URL。

下面是一个在action方法中使用当前请求协议的例子:

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

HtmlHelper (@Html)也有一个ActionLink方法的重载,你可以在razor中使用它来创建一个锚元素,但它也需要hostName和fragment参数。所以我选择使用@Url。行动:

<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类构建绝对动作url的博客文章,为了可读性,我建议写一个自定义扩展方法:

/// <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")

这个问题是针对ASP . net的,但是我相信你们中的一些人会受益于系统不可知的javascript,这在很多情况下是有益的。

更新:的方式得到url外部形成的页面本身是很好的回答上面的描述。

或者你可以像下面这样做一个在线程序:

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

从过滤器或:

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,一半web-forms,一半vb-script的系统中特别好,而且每次都需要使用不同的方法来获取当前页面的URL。

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

这可能只是我非常非常挑剔,但我喜欢只定义一次常数。如果您使用上述定义的任何方法,您的动作常数将被定义多次。

为了避免这种情况,您可以采取以下措施:

    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();
}
}

然后创建你的控制器,比如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>

这确实要做很多工作,但是我知道编译时验证是站在我这边的,所以我可以放心了。

这就是你需要做的。

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

我对此有一个问题,我的服务器在负载均衡器后面运行。负载均衡器正在终止SSL/TLS连接。然后它使用http将请求传递给web服务器。

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

我可能欺骗了一点,但这正是我需要强制https url:

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

实际上我用的是网络。配置AppSetting,这样我就可以在本地调试时使用http,但所有测试和prod环境都使用转换来设置https值。