2010-11-02 32 views
7

我正在爲ASP.NET WebForms/MVC運行時組合資源庫。我通過WebControl支持標準的ASP.NET WebForms,並且最近還增加了對ASP MVC Html Helpers的支持。我目前支持WebForms WebControl的一個功能是「部分」資源定義的概念,其中資源可以通過主/視圖頁面進行組合。幫助ASP.NET MVC HtmlHelper API設計

當實現MVC等效項時,我不確定什麼是最好的練習是?我目前傾向於設計是這樣的:

母版頁

<% using (Html.CreateCompositeResourcePartContext()) 
    { 
    Html.CompositeCssResourcePart(
     "ResourceName", 
     new[] { "/Styles/SharedStyle1.css", "/Styles/SharedStyle2.css" } 
    ); 
    %> 
    <asp:ContentPlaceHolder ID="head" runat="server"> 
    </asp:ContentPlaceHolder> 
<% } %> 

,這將創造頭部周圍的ContentPlaceHolder「上下文」包裝。

查看頁面

<asp:Content ID="HeadContentPlaceholder" ContentPlaceHolderID="head" runat="server"> 
    <% Html.CompositeCssResourcePart(
    "ResourceName", 
    new[] 
    { 
     "/Styles/PageStyle5.css", 
     "/Styles/PageStyle6.css", 
     "/Styles/PageStyle7.css" 
    }) %> 
</asp:Content> 

所以從上面可以看出任何視圖頁面可以延長部分資源定義。

的問題,我有:

1)我不像其他HtmlHelpers,這些擴展不要馬上寫出來的HTML片段,而是等到情境佈置。這些擴展是否應該取代ViewContext(或其他對象)?

2)我個人認爲「使用」的概念是有意義的,可以包裝一段代碼而不是單獨的BeginCompositeResourcePartContext/EndCompositeResourcePartContext調用,你會同意嗎?如果不是,那麼單獨的方法調用有什麼更好的?

以上任何反饋將不勝感激。如果需要更多細節,請告訴我。

編輯

爲了澄清...主頁的頭部和在側相繼的基準內的塊的圖頁將被一起組合在單個資源。因此,當CompositeResourcePartContext的環境佈置,所有六個文件組合成只有一個CSS文件,並寫出來作爲單獨的鏈接TAG(或腳本,CSS雪碧等)

<link rel="stylesheet" type="text/css" href="/MyMergedStyleSheet.css" /> 
+0

我不確定這個幫手會給你買什麼。首先,這不是佔位符的內容嗎? – 2010-11-02 13:04:55

+0

@John - 這個想法是,每次調用Html.CompositeCssResourcePart都會定義一個複合資源的一部分(即,當上下文被處理時,將會合併到一個文件中)。因此,我需要一種收集所有零件的方法,因爲在引用的所有資源中生成URL時,可以呈現鏈接/腳本標記。說得通? – 2010-11-02 13:08:43

+0

'使用'在這種情況下是有意義的,但除此之外,我無法評論。 – 2010-11-02 13:17:55

回答

4

給它一些更多的思考(和諮詢同事),我覺得最好的辦法是堅持我原來不污染我的ASP的計劃之後.NET MVC API具有「部分」資源定義的概念(適用於WebControls,但在我看來與MVC不太一樣)。此前考慮這種情況在我的圖書館明確的HtmlHelper擴展,我建議,這個問題可以通過定義如下自定義擴展方法來處理:

public static class CustomXpediteExtensions 
{ 
    private static readonly IEnumerable<String> SharedCss = new[] 
    { 
     "/Styles/SharedStyle1.css", 
     "/Styles/SharedStyle2.css", 
     "/Styles/SharedStyle3.css" 
    }; 

    public static MvcHtmlString CustomCompositeCssResource(this HtmlHelper htmlHelper, params String[] resources) 
    { 
     return htmlHelper.CompositeCssResource(SharedCss.Concat(resources)); 
    } 
} 

,然後簡單地引用該自定義擴展(或常數等)在視圖頁面中。

<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server"> 
    <%= Html.CustomCompositeCssResource(
     "/Styles/PageStyle5.css", 
     "/Styles/PageStyle6.css", 
     "/Styles/PageStyle7.css" 
    ) %> 
</asp:Content> 

這將使您在組合共享資源(即確保一致性)時不會重複自己,並最終處理案件。

我會離開這段時間看看是否有任何反饋,但除非有一個很好的例子說明爲什麼這是不可接受的,我認爲這是答案。

+0

輝煌,我在偷這個.. – 2015-02-05 05:33:46

2

這似乎是一個偉大的想法,但它可能更適合作爲構建過程的一部分。您可以使用T4模板輕鬆地爲各個頁面創建合併的CSS,並且可能會將該CSS引用添加到頁面的命名慣例。喜歡的東西:

<%: Html.MergedStyleSheet() %> 

可以輸出:

<link rel="stylesheet" type="text/css" href="/Content/ControllerName/ActionName.css" /> 
+0

我以前使用過構建任務,這絕對是一種選擇。我在運行時方法中看到的主要優點是,您可以像定期那樣定義每個頁面中的資源,並且可以輕鬆地在縮小/組合和調試模式之間切換,而無需額外的工作;你也不必擔心維護構建任務或版本控制問題等。另外,當我處理CSS Sprites時,我個人喜歡直接在正在使用它的頁面中看到精靈定義。我的興趣在於我尚未涉及的上述場景的擬議API。 – 2010-11-02 14:17:17