如何在MVC3中使用https生成绝对URL?

时间:2011-04-04 13:27:34

标签: asp.net asp.net-mvc asp.net-mvc-3 https routes

我正在使用MVC3并尝试从https提供内容,问题是当我调用Url.Content时,仍然使用相对网址从http提供文件。我认为这个问题在MVC3中得到了解决,但我似乎无法找到任何解决方案。有没有人知道这个问题是否在MVC3中固有地解决了,以及如何完成它或者我是否需要创建自己的帮助方法来根据协议生成绝对的Url?

4 个答案:

答案 0 :(得分:28)

您可以使用VirtualPathUtility.ToAbsolute实现自己的解决方案。可能是这样的:

public static class UrlHelperExtension {
  public static string Absolute(this UrlHelper url, string relativeOrAbsolute) {
    var uri = new Uri(relativeOrAbsolute, UriKind.RelativeOrAbsolute);
    if (uri.IsAbsoluteUri) {
      return relativeOrAbsolute;
    }
    // At this point, we know the url is relative.
    return VirtualPathUtility.ToAbsolute(relativeOrAbsolute);
  }
}
你会用的是

@Url.Absolute(Url.Content("~/Content/Image.png"))

(我自己没有测试过,可以随意玩,以使其正常工作。)

这有助于您为内容文件生成绝对URL。为了更改生成的URL的方案,您可以创建一个额外的扩展方法来操作给定URL的方案,以便它们是HTTPS或其他。

正如Khalid在评论中指出的那样,类似的扩展方法已经可以在各种开源项目中使用,您可以使用(鉴于许可证允许)。可以找到一个示例here

答案 1 :(得分:15)

@BlackTigerX建议的不使用扩展方法或硬编码协议的解决方案:

Url.RouteUrl("Default", new { Action = "About" }, Request.Url.Scheme)

如以下文章中所述:http://captaincodeman.com/2010/02/03/absolute-urls-using-mvc-without-extension-methods/

答案 2 :(得分:10)

你可以使用Url.RouteUrl,一些重载采用协议参数,看起来像这样:

Url.RouteUrl("Product", new { itemId = "123456" }, "https");

查看重载并查看可以使用哪一个

答案 3 :(得分:1)

如果您不想“构建”网址并且只想要当前页面的完整路径,那么这就可以了。

Context.Server.UrlEncode(Context.Request.Url.AbsoluteUri)

我知道它不像扩展方法那么优雅,但考虑将其分享用于教育目的