2011-04-04 102 views
18

我正在使用MVC3並試圖從https服務內容,問題是當我調用Url.Content時,文件仍然使用相對url從http服務。我認爲這個問題已在MVC3中解決,但我似乎無法找到任何解決方案。有人知道這個問題是否在MVC3中內在地解決,如何完成它,或者我需要創建自己的幫助器方法來生成基於協議的絕對Url?如何使用https在MVC3中生成絕對URL?

+0

下面的解決方案都很好,但我想指出,如果你在負載平衡的環境,那麼所有的賭注都將關閉,以生成什麼網址。 – 2012-04-05 12:17:18

回答

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的方案,以便它們是HTTPS或其他內容。

正如Khalid在評論中指出的那樣,類似的擴展方法已經可以在各種可以使用的開源項目中使用(假設許可證允許)。一個例子可以發現here

+0

你的建議與Mike Hadlow非常相似。 http://www.google.com/codesearch/p?hl=en#MEucUyOL2vo/trunk/Suteki.Shop/Suteki.Common/Extensions/UrlExtensionsHelper.cs&q=SSL%20package:http://sutekishop%5C.googlecode% 5C.com&d = 4 – 2011-04-04 17:38:47

+0

我以前沒有見過,會更新答案,添加一個鏈接。謝謝。 – paracycle 2011-04-05 07:52:28

+2

看起來像這也值得創建一個Url.ContentAbsolute或類似的方法,而不是每次都需要包裝它們 – 2011-04-05 12:29:37

10

您可以使用Url.RouteUrl,一些重載採取協議參數,看起來是這樣的:

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

看看一個重載,看看你可以使用一個

1

如果你不想以「建」的網址,只希望當前頁面的完整路徑,這將這樣的伎倆

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

我知道它不是一個擴展方法一樣優雅,但想到共享它用於教育目的

15

不使用擴展方法或硬編碼協議,由@BlackTigerX因爲提出了一個解決方案:

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

在建議下面的文章:http://captaincodeman.com/2010/02/03/absolute-urls-using-mvc-without-extension-methods/

+1

+1你經常看到這些解決方案中的硬編碼協議...... – Tr1stan 2012-05-11 10:58:31

+0

正是這位博士訂購的。 – neizan 2012-08-15 15:47:06

+0

這正是我所期待的。我的目標是編寫我的組件,以便它可以部署到http或https環境而無需更改,這讓我可以做到。 – 2013-02-28 17:04:24