2011-12-02 195 views
0

我是新來的asp.net,但母版頁似乎做我所需要的 - 允許我在運行時配置不同的模板/演示文稿/樣式,所以我的應用程序可能會採取通過選擇一個不同的主頁面,不同的外觀和感覺。每個母版頁位於其自己的文件夾中,併爲該「模板」量身定製了一組圖像 - 然後,我希望在內容頁面中引用位於當前所選母版頁的文件夾中的各種圖像,例如a中的導航按鈕DataPager:如何指定相對於當前主頁文件的路徑

<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" 
    PageSize="25"> 
<Fields> 
    <asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="True" 
     ShowNextPageButton="False" 
     FirstPageImageUrl="<<Current Master Root>>/img/action-first.png" 
     PreviousPageImageUrl="<<Current Master Root>>/img/action-prev.png" /> 
    <asp:NumericPagerField ButtonCount="10" NextPageText="&gt;&gt;" 
     PreviousPageText="&lt;&lt;" /> 
    <asp:NextPreviousPagerField ButtonType="Image" ShowLastPageButton="True" 
     ShowPreviousPageButton="False" 
     LastPageImageUrl="<<Current Master Root>>/img/action-last.png" 
     NextPageImageUrl="<<Current Master Root>>/img/action-next.png" /> 
</Fields> 
</asp:DataPager> 
TEST: "<%= System.IO.Path.GetDirectoryName(MasterPageFile) %>" 
(this does not work if we try to use it inside the DataPager?) 

有沒有適當的方法來做到這一點,就像tilda〜字符是用來進入應用程序的根文件夾?在代碼中設置它也被證明是很乏味的,特別是對於像DataPager這樣的屬性嵌套在子控件動態列表中的東西(例如我不知道如何設置屬性DataPager1.Fields [0] .NextPreviousPagerField.FirstPageImageUrl in碼)。

我發現試圖做到這一點與主題需要更多的編碼比我開始,因爲我必須包括在皮膚文件中的整個控制定義,不只是圖像的url屬性,然後我必須複製該代碼每一個主題/皮膚。如果我碰巧想要一個具有不同配置的按鈕和/或數字字段的DataPager,那麼我必須在每個皮膚文件中複製這些變體。如果我稍後做出更改,我將不得不記住要在所有皮膚上進行更改 - 嚴重影響將代碼與皮膚分離的目的。

我的應用程序運行多個項目,每個項目可能會選擇自己的模板。對於整個應用程序,我想說:如果當前項目使用TemplateX,則使用來自文件夾/ TemplateX/img /的圖像,如果選擇了TemplateY,則使用來自/ TemplateY/img /的圖像。正如你所知道的,CSS不能總是依賴於決定在哪裏使用哪個圖像,所以我們必須能夠直接在HTML輸出中放置圖像引用。

在我開發的自定義ISAPI DLL網絡系統中,我只是簡單地使用像「[#HTML.Template] /img/prev.png」這樣的替換字符串來將模板文件夾粘貼到圖像URL前面。有沒有辦法讓我可以掛鉤一個自定義的.aspx預處理器來手動替換當前所選文件夾的所有出現,如上例中的「< < <當前主根>>」?

+1

你可能想在主題尋找替代 - 見http://msdn.microsoft.com/en-us/library/ykzx33wh.aspx您可以在運行時切換主題很容易。 – dash

+0

使用主題類作品,但不是一個很好的解決方案。我可以將img子文件夾放入主題文件夾,但我必須將所有內容包含在標記中,而不僅僅是圖片url屬性。這意味着我必須爲每個主題(以及每種類型和控制的變體)複製所有這些代碼,這種方式會使目標失敗。 – Etherman

+0

我認爲你有一個相當體面的解決方案是誠實的。我可能會將我的圖像URL寫爲「/{MASTER}/img/img.png」,並使用UrlRewriting庫來捕獲此URL的路徑,並用當前母版頁替換該標記。這相當於你擁有的,儘管你不需要一個自定義的ISAPI DLL - 你可以將一個處理程序映射到你的.Net代碼上(http://msdn.microsoft.com/en-us/library/ms972953.aspx )。另一種方法是從框架中派生自己的自定義控件,並更改其渲染方法以瞭解母版頁 - 您擁有的解決方案更容易。 – dash

回答

0

嘗試使用smething這樣

var path = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpContext.Current.Request.ApplicationPath; 
+0

您的代碼不包含當前的主頁面。爲此,我可以使用「System.IO.Path.GetDirectoryName(MasterPageFile)」,但如前所述,似乎沒有方便的方式在DataPager中聲明使用它。 – Etherman

相關問題