2010-11-02 16 views
7

के साथ सहायता मैं एएसपी.नेट वेबफॉर्म/एमवीसी के लिए रनटाइम समग्र संसाधन लाइब्रेरी पर काम कर रहा हूं। मैं वेबकंट्रोल के माध्यम से मानक एएसपी.नेट वेबफॉर्म दोनों का समर्थन करता हूं और हाल ही में एएसपी एमवीसी एचटीएमएल हेल्पर्स के लिए समर्थन भी जोड़ा है। एक सुविधा जो मैं वर्तमान में वेबफॉर्म वेबकंट्रोल के साथ समर्थन करता हूं वह "आंशिक" संसाधन परिभाषाओं की अवधारणा है जहां संसाधन को मास्टर/व्यू पेज आदि पर जोड़ा जा सकता है।एएसपी.नेट एमवीसी एचटीएमएलहेल्पर एपीआई डिजाइन

एमवीसी समकक्ष को लागू करते समय, मुझे यकीन नहीं है कि सबसे अच्छा क्या है अभ्यास है?

मास्टर पृष्ठ

<% 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 के विपरीत, इन एक्सटेंशन तुरंत बाहर एचटीएमएल टुकड़ा नहीं लिखते बल्कि जब तक संदर्भ निपटान किया जाता है रुको। क्या इन एक्सटेंशन को इसके बजाय ViewContext (या कुछ अन्य ऑब्जेक्ट) बंद होना चाहिए?

2) मुझे व्यक्तिगत रूप से लगता है कि "उपयोग" की अवधारणा को अलग-अलग BeginCompositeResourcePartContext/EndCompositeResourcePartContext कॉल के बजाय कोड के ब्लॉक को लपेटने के लिए समझ में आता है, क्या आप सहमत होंगे? यदि नहीं, अलग विधि कॉल के बारे में बेहतर क्या है?

उपर्युक्त पर कोई भी प्रतिक्रिया बहुत सराहना की जाएगी। यदि अधिक जानकारी की आवश्यकता है, तो कृपया मुझे बताएं।

संपादित

स्पष्ट करने के लिए एक भी संसाधन के लिए ... मास्टर पेज के सिर और पक्ष में बाद में संदर्भ के अंदर ब्लॉक एक दृश्य के पेज एक साथ संयुक्त कर दिया जाएगा। तो जब CompositeResourcePartContext के संदर्भ निपटान किया जाता है, सभी छह फ़ाइलें केवल एक सीएसएस फ़ाइल करने के लिए संयुक्त और एक ही कड़ी टैग (या स्क्रिप्ट, सीएसएस स्प्राइट आदि)

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

मुझे यकीन नहीं है कि यह सहायक आपको क्या खरीदता है। क्या यह नहीं है कि सामग्री प्लेसहोल्डर पहले स्थान पर हैं? –

+0

@ जॉन - विचार यह है कि प्रत्येक कॉल Html.CompositeCssResourcePart एक समग्र संसाधन के एक भाग को परिभाषित करेगा (यानी, जब संदर्भ का निपटारा किया जाता है तो एक फ़ाइल में एक साथ विलय किया जाएगा)। इस प्रकार, मुझे किसी लिंक/स्क्रिप्ट टैग को प्रस्तुत करने से पहले सभी भागों को एकत्रित करने की विधि की आवश्यकता होती है क्योंकि यूआरएल संदर्भित सभी संसाधनों से उत्पन्न होता है। समझ में आता है? –

+0

'उपयोग' इस संदर्भ में समझ में आता है, लेकिन मैं उससे परे टिप्पणी नहीं कर सकता। –

उत्तर

4

कुछ और सोचा कि यह दे रही है (और एक सहयोगी परामर्श) मुझे लगता है कि सबसे अच्छा विकल्प मेरे एएसपी प्रदूषण नहीं की अपने मूल योजना के साथ रहना है के बाद "आंशिक" संसाधन परिभाषाओं (वेबकंट्रोल के लिए काम करता है, लेकिन मेरी राय में एमवीसी के साथ अच्छा नहीं) की अवधारणा के साथ .NET एमवीसी एपीआई।मेरी लाइब्रेरी में इस मामले के लिए एक स्पष्ट 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

शानदार, मैं इसे चोरी कर रहा हूं .. –

2

यह एक महान विचार की तरह लगता के रूप में बाहर लिखा जाता है, लेकिन यह निर्माण प्रक्रिया के एक हिस्से के रूप में बेहतर सेवा दी जा सकती है। आप टी 4 टेम्पलेट का उपयोग करके अलग-अलग पृष्ठों के लिए विलयित सीएसएस आसानी से बना सकते हैं, और शायद आपके पृष्ठ पर उस सीएसएस संदर्भ को जोड़ने के लिए एक नामकरण सम्मेलन बना सकते हैं। कुछ की तरह:

<%: Html.MergedStyleSheet() %> 

सकता है उत्पादन:

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

मैंने अतीत में बिल्ड कार्यों का उपयोग किया है, और यह निश्चित रूप से एक विकल्प है। रनटाइम दृष्टिकोण को देखते हुए मुख्य लाभ यह है कि आप प्रत्येक पृष्ठ में अपने संसाधनों को लगभग नियमित रूप से परिभाषित कर सकते हैं, जैसा कि आप नियमित रूप से करेंगे और बिना किसी अतिरिक्त प्रयास के न्यूनतम/संयुक्त और डीबग मोड के बीच आसानी से स्विच कर सकते हैं; आपको बिल्ड बिल्ड या वर्जन कंट्रोल इश्यू इत्यादि को बनाए रखने के बारे में भी चिंता करने की ज़रूरत नहीं है। साथ ही, जैसे ही मैं सीएसएस स्प्राइट्स को संभालता हूं, मैं व्यक्तिगत रूप से स्प्राइट परिभाषा को उस पेज में सीधे देख रहा हूं जो इसे खा रहा है। मेरी दिलचस्पी उपर्युक्त परिदृश्य के लिए प्रस्तावित एपीआई में है जिसे मैंने अभी तक कवर नहीं किया है। –

संबंधित मुद्दे