2011-03-15 4 views
7

मैं वर्तमान में एक विधि का उपयोग कर रहा हूं जो लेआउट फ़ाइल के शीर्ष पर स्क्रिप्ट और सीएसएस फ़ाइलों को जोड़ने के लिए निम्न कोड जैसा दिखता है।आंशिक विचारों से एमवीसी 3 रेजर वेबसाइट में लेआउट फ़ाइल में जेएस और सीएसएस जोड़ने की कोशिश कर रहे हैं

public static class HtmlHelperExtensions 
{ 
    public static MyCompanyHtmlHelpers MyCompany(this HtmlHelper htmlHelper) 
    { 
     return MyCompanyHtmlHelpers.GetInstance(htmlHelper); 
    }  
} 

public class MyCompanyHtmlHelpers 
{ 
    private static MyCompanyHtmlHelpers _instance; 

    public static MyCompanyHtmlHelpers GetInstance(HtmlHelper htmlHelper) 
    { 
     if (_instance == null) 
      _instance = new MyCompanyHtmlHelpers(); 

     _instance.SetHtmlHelper(htmlHelper); 

     return _instance; 
    } 

    private HtmlHelper _htmlHelper; 

    public ItemRegistrar Styles { get; private set; } 
    public ItemRegistrar Scripts { get; private set; } 

    public MyCompanyHtmlHelpers() 
    { 
     Styles = new ItemRegistrar(ItemRegistrarFromatters.StyleFormat); 
     Scripts = new ItemRegistrar(ItemRegistrarFromatters.ScriptFormat); 
    } 

    private void SetHtmlHelper(HtmlHelper htmlHelper) 
    { 
     _htmlHelper = htmlHelper; 
    } 
} 

public class ItemRegistrar 
{ 
    private readonly string _format; 
    private readonly List<string> _items; 

    public ItemRegistrar(string format) 
    { 
     _format = format; 
     _items = new List<string>(); 
    } 

    public ItemRegistrar Add(string url) 
    { 
     if (!_items.Contains(url)) 
      _items.Insert(0, url); 

     return this; 
    } 

    public IHtmlString Render() 
    { 
     var sb = new StringBuilder(); 

     foreach (var item in _items) 
     { 
      var fmt = string.Format(_format, item); 
      sb.AppendLine(fmt); 
     } 

     return new HtmlString(sb.ToString()); 
    } 
} 

public class ItemRegistrarFromatters 
{ 
    public const string StyleFormat = "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />"; 
    public const string ScriptFormat = "<script src=\"{0}\" type=\"text/javascript\"></script>"; 
} 

उन्हें Layout_.cshtml में प्रस्तुत करने के लिए फ़ाइलें ... और @Html.MyCompany().Styles.Render() जोड़ने के लिए Html.MyCompany().Styles.Add("/Dashboard/Content/Dashboard.css"); का उपयोग करना।

मेरी समस्या यह है कि यह एक स्थिर विधि है जिसका अर्थ है कि यह स्टाइलशीट्स और स्क्रिप्ट फ़ाइलों की सूची बनी हुई है।

मुझे वही काम करने की ज़रूरत है जो यह करता है लेकिन इसे लगातार बनाए रखे बिना।

मुझे प्रत्येक अनुरोध पर रीमेड होने की सूचियों की आवश्यकता है क्योंकि वे पृष्ठ से पृष्ठ पर उस विशिष्ट पृष्ठ पर क्या दिखते हैं।

क्या आवश्यक स्क्रिप्ट जोड़ने से पहले या संभवतः प्रस्तुत किए जाने के बाद प्रत्येक अनुरोध पर सूचियों को साफ़ करना संभव है?

अद्यतन: एक वर्ग का उपयोग नहीं करने के लिए कारण, RenderPartial या RenderaActions ही स्टाइलशीट या स्क्रिप्ट फ़ाइल को रोकने के लिए है लेआउट फाइल करने के लिए एक बार से अधिक जोड़े जाने के लिए।

साइट आईएम बिल्डिंग में बुनियादी लेआउट के साथ लेआउट_.cshtml है। बदले में यह एक दृश्य द्वारा उपयोग किया जाता है जो वस्तुओं की सूची के माध्यम से लूप करता है और प्रत्येक आइटम के लिए एक रेंडरएक्शन कहा जाता है जो उस आइटम के विशिष्ट आंशिक दृश्य को आउटपुट करता है। इन आंशिक विचारों को कभी-कभी स्टाइलशीट और स्क्रिप्ट जोड़ने की आवश्यकता होती है।

विभिन्न आंशिक विचारों से कई अलग-अलग स्क्रिप्ट और स्टाइलशीट जोड़ने की आवश्यकता हो सकती है क्योंकि शैलियों और स्क्रिप्ट के लिए वैश्विक सूची एकमात्र तरीका था जिसे मैंने सोचा था कि ऐसा किया जा सकता है ताकि यह जांचने के लिए एक वैश्विक स्थान हो कि स्क्रिप्ट पहले से ही है या नहीं संग्रह में जोड़ा गया है या नहीं और फिर उन्हें एक साथ क्रम में प्रस्तुत किया गया था।

अद्यतन 2: असली सवाल यह है कि समारोह के (एक वैश्विक सूची) एक ही तरह, लेकिन एक स्थिर विस्तार विधि का उपयोग कर के बिना करना है।

+0

वह स्थैतिक क्षेत्र बर्बाद हो गया है! ऐसा मत करो ... देख रहे हैं ... –

+1

मुझे पूरा यकीन नहीं है * क्यों * बिल्कुल आपको ऐसा करने की ज़रूरत है? क्या आप इसे सेक्शन, रेंडरपार्टियल या रेंडर एक्शन के साथ नहीं कर सकते? –

+0

हां स्थिरताएं शुद्ध बुराई हैं, मैंने इससे सीखा है लेकिन मेरे पास विकल्प बहुत से नहीं थे :) मुझे अभी भी लगता है कि मुझे स्क्रिप्ट और स्टाइलशीट्स के लिए एक अच्छी सूची में इसे बनाए रखने में सक्षम होने के लिए वैश्विक सूची की आवश्यकता है। –

उत्तर

9

मैं वर्गों के साथ ऐसा होता है, यानी

@section head { 
    ...add whatever you want here... 
} 

और लेआउट से "सिर" अनुभाग प्रस्तुत करना:

<head> 
...other stuff here... 
@RenderSection("head", required: false) 
</head> 

आप वर्गों नहीं करना चाहते हैं, और इसे चारों ओर पास नहीं करना चाहते हैं, मैं यहां HttpContext का उपयोग करूंगा; HttpContext.Current.Items[someKey] के खिलाफ कुछ डेटा स्टोर करें। यदि यह शून्य है, तो एक नया बनाएं और इसे संदर्भ में संग्रहीत करें।

उदाहरण के लिए:

public static MyCompanyHtmlHelpers GetInstance(HtmlHelper htmlHelper) 
{ 
    const string key = "MyCompanyHtmlHelpersInstance"; 
    IDictionary items = (htmlHelper == null || htmlHelper.ViewContext == null 
     || htmlHelper.ViewContext.HttpContext == null) 
     ? HttpContext.Current.Items : htmlHelper.ViewContext.HttpContext.Items; 

    MyCompanyHtmlHelpers obj = (MyCompanyHtmlHelpers)items[key]; 
    if (obj == null) 
    { 
     items.Add(key, obj = new MyCompanyHtmlHelpers()); 
    } 
    return obj; 
} 
+0

@Marc: सेक्शन-डेफिनिशन के सामने @ लापता है। इसके अलावा, वोट दें :) –

+0

@Yngve - ta; तय है कि। आपको लगता है कि मुझे याद होगा कि अब तक ... –

+0

यदि मैं रेंडर क्रियाओं द्वारा बनाए गए आंशिक विचारों के अंदर अनुभागों को परिभाषित कर सकता हूं, तो मैं दृश्य में उपयोग करता हूं, लेकिन यह वास्तव में कुछ तरीका है जिसे मैं देख सकता हूं एक स्क्रिप्ट या स्टाइलशीट को पहले ही सेक्शन में जोड़ा नहीं गया है? –

0

आपको एचटीएमएल सहायक को थोड़ा अलग तरीके से बढ़ाने की आवश्यकता है।

public static MvcHtmlString AddStyle(this HtmlHelper<TModel> html, string styleUrl) 
{ 
    string styleTag = string.Format("<link rel='stylesheet' type='text/css' href='{0}' />", styleUrl); 
    return MvcHtmlString.Create(styleTag); 
} 
अपने ध्यान में रखते हुए

तो बस कार्य करें:

<head> 
    @Html.AddStyle("/Dashboard/Content/Dashboard.css") 
</head> 

आप की जरूरत है जड़ सापेक्ष URL सिर्फ यूआरएल सामग्री सहायक में फेंक देते हैं।

<head> 
    @Html.AddStyle(Url.Content("~/Dashboard/Content/Dashboard.css")) 
</head> 
+0

आंशिक दृश्य से लेआउट फ़ाइल में शैलियों को कैसे जोड़ता है? –

+0

क्या मैंने आपके प्रश्न का गलत व्याख्या नहीं किया है। – Chev

1

मैं अपने आप को एक ही समस्या में पड़ गए और कुछ के साथ आया था, मुझे आशा है कि उपयोगी है।

क्या मैं के साथ आया था के लिए यह अन्य प्रश्न देखें:

How to render JavaScript into MasterLayout section from partial view?

+1

आपके अन्य उत्तर पर मेरी टिप्पणियों के अनुसार, मेरा सुझाव है कि इससे पहले कि आप इसे ध्वजांकित कर लें और समुदाय द्वारा संभवतः हटा दिया जाए, इससे पहले कि आप इसका समाधान करें। धन्यवाद। – Kev

+0

करेंगे, दयालु महोदय। –

0

आंशिक दृश्य के लिए विचारों की वजह से मेरे लिए कोशिश इस

Add CSS or JavaScript files to layout head from views or partial views

काम करता है लेकिन नहीं।

आंशिक विचारों के लिए डेटा को एक स्थिर वर्ग में पास कर दें।

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