DNN永遠都是運行在網站的根目錄
DNN的設計上最大的特點就是始終是使用一個網站根目錄下的Default.aspx文件加載皮膚和模塊從而實現整個網站的頁面。這也就是說DNN這個Asp.net程序永遠是運行在DNN網站的根目錄的,所有的資源文件(如:JS文件,圖片,CSS)的引用都要從DNN網站的根目錄算起。
這麼說有點難以理解,舉個例子吧:
假設你把DNN安裝到了一個虛擬目錄下面,比如DotNetNuke_2目錄下,那麼你輸入http://localhost/DotNetNuke_2就可以訪問到這個DNN網站了。
然後你新建了一個模塊,放到了DNN網站的DesktopModules/MyModuleName目錄下。現在你新建模塊在IIS中位置應該是這樣的:http://localhost/DotNetNuke_2/DesktopModules/MyModuleName
問題來了
現在你需要在View.ascx文件中放入一個圖片,作為界面的一部分,這個圖片的名字是”CompanyLogo.gif”,位置就在”MyModuleName”這個目錄下,自然,我們可以放入一個img tag,如下:
<imgsrc=””alt=”youralt”/>
現在問題來了,這個src到底是多少呢?
是使用”./CompanyLogo.gif”?我們先來試試,代碼如下:
<imgsrc=”./CompanyLogo.gif”alt=”youralt”/>
最後生成的html代碼跟這一樣:
<imgsrc=”./CompanyLogo.gif”alt=”youralt”/>
並且圖片沒有顯示,仔細一想,對啊,DNN是一直在根目錄運行,模塊只是作為一個控件加載,DNN的根目錄下自然沒有CompanyLogo.gif這個文件。
這樣不行就使用全名指定吧,這總沒問題了吧。我們來試試:
<imgsrc=”DotNetNuke_2/DesktopModules/MyModuleName/CompanyLogo.gif”alt=”youralt”/>
運行後,圖片顯示了,這樣可以!
不過等等,如果別人用這個模塊,虛擬目錄可能就不是這個名字了,這個怎麼處理?
ModulePath
這樣的話,目錄的路徑就應該動態生成了,DNN已經為我們考慮了這個問題,在PortalModuleBase基類裡,有一個ModulePath屬性,使用這個屬性就可以動態生成資源對應的路徑了。
最後的代碼如下:
<imgsrc=”<%=ModulePath%>CompanyLogo.gif”alt=“youralt”/>
就可以了。
在這裡ModulePath 的值為 "/DotNetNuke_2/DesktopModules/ MyModuleName /"
ResolveUrl
還有一個函數可以了解一下,就是在DotNetNuke.Common.Global類中的ResoveUrl函數
PublicFunctionResolveUrl(ByValurlAsString)AsString
如果傳入的URL以”~”開頭,就會使用ApplicationPath代替”~”。
就是說我們可以用”~”來指代DNN的網站根目錄,這樣對於任何資源,我們只要使用”~”來開頭,從根目錄開始制定,就都可以引用到。
在這個例子裡,可以這麼寫:
Page.ResolveUrl(“~/DesktopModules/MyModuleName/CompanyLogo.gif”)
這裡
ApplicationPath的值為"/DotNetNuke_2"
最後
希望這些小技巧能幫你解決一些問題!