javascript आंशिक दृश्य के अंदर वर्गों का उपयोग करने में सक्षम होने के लिए स्वच्छ विकल्प?




asp.net-mvc asp.net-core (3)

मुझे लगता है कि यह निष्पक्ष होगा, लेकिन शायद कम से कम उपयोगी उत्तर यह है कि "आप MVC6 गलत का उपयोग कर रहे हैं यदि आप आंशिक में अनुभागों का उपयोग करना चाहते हैं या इसे अनुकरण करना चाहते हैं"।

आपकी समस्या का आदर्श समाधान के लिए 3 मुख्य मामले हैं:

  1. आंशिक / ViewComponent को 0 बार जोड़ा गया है और संबंधित JavaScript लाइब्रेरी को 0 बार जोड़ा गया है
  2. आंशिक / दृश्यसंचार एक बार जोड़ा जाता है, संबंधित जावास्क्रिप्ट पुस्तकालय 1 बार जोड़ा जाता है और गतिशील रूप से निर्मित आरम्भिकरण जावास्क्रिप्ट एक बार बनाया जाता है और पुस्तकालय के बाद रखा जाता है।
  3. आंशिक / व्यूसंचार कई बार जोड़ा जाता है, संबंधित जावास्क्रिप्ट पुस्तकालय को 1 समय जोड़ा जाता है और प्रत्येक आंशिक / दृश्य वस्तु के लिए गतिशील रूप से निर्मित प्रारंभिक जावास्क्रिप्ट बनाया जाता है और सभी को लाइब्रेरी के बाद रखा जाता है।

3 मुख्य विकल्प हैं

  1. <hidden data-myTool-*="MyData"> और पृष्ठ के निचले भाग में इसे पढ़ने के लिए एक मुख्य स्क्रिप्ट है (आदर्श नहीं क्योंकि यह # 1 का उल्लंघन करती है)
  2. एक डिफरेडएक उपकरण बनाएं (आदर्श लेकिन बाहरी क्लास का संदर्भ)
  3. अपनी स्क्रिप्ट निर्भरताओं को जोड़ने के लिए आंशिक रूप से स्ट्रिंग्स की एक सूची पास करें (आदर्श लेकिन केवल आसानी से गैर-लेआउट के दृश्य के साथ काम कर सकते हैं और आंशिक मॉडल मॉडल का उपयोग नहीं कर रहे हैं)

यह विकल्प 3 का एक उदाहरण है:

आंशिक:

@model List<string>

FROM TEST PARTIAL
@{ Model.Add("Partial.js");}

राय:

@{
    var jsfiles = new List<string>();
    jsfiles.Add("View.js");
}
@Html.Partial("_Test", jsfiles)
@Html.Partial("_Test", jsfiles)
@Html.Partial("_Test", jsfiles)
@section scripts {
    @foreach (string file in jsfiles.Distinct().ToList())
    {
        <script src="@file"></script>
    }
}

परिणाम:

<script src="View.js"></script>
<script src="Partial.js"></script>

चूंकि हम आंशिक दृश्य के अंदर वर्गों का उपयोग करने में सक्षम नहीं हैं, इसलिए लिपियों को शामिल करने के लिए साफ दृष्टिकोण क्या है जो केवल आंशिक द्वारा आवश्यक है?

मुझे पता है कि मैं आंशिक कॉल करने वाले पृष्ठ में मेरी स्क्रिप्ट अनुभाग को शामिल कर सकता हूं, लेकिन अगर मेरी आंशिक एक जावास्क्रिप्ट घटक को शामिल करता है जिसे मैं अपनी साइट पर फिर से उपयोग करना चाहता हूं, तब प्रत्येक आधार पृष्ठ में कस्टम स्क्रिप्ट शामिल है एक रखरखाव दुःस्वप्न है

यह विचार करते हुए कि आंशिक रूप से जेएस को आंशिक रूप से उपयोग करने में सक्षम नहीं किया जा रहा है, क्या मैं एक पुन: प्रयोज्य दृश्य के लिए आंशिक उपयोग करना चाहता हूं जो जावास्क्रिप्ट घटकों को शामिल करता है?


मैं यह इष्टतम नहीं दिखाएगा, लेकिन यदि आप अपना खुद का व्यू पृष्ठ एक्सटेंशन नहीं बनाना चाहते हैं, तो आप इस तरह से कुछ का निर्माण करने में सक्षम हो सकते हैं:

public static class DeferredScripts
{
    static IList<string> paths = new List<string>();

    public static IList<string> Scripts { get; set; }

    public static void Add(string path)
    {
        if (Scripts == null)
        {
            Scripts = new List<string>();
        }

        if (!paths.Any(s => s.Equals(path, StringComparison.OrdinalIgnoreCase)))
        {
            var script = new TagBuilder("script");
            script.Attributes.Add("src", path);

            Scripts.Add(script.ToString());
            paths.Add(path);
        }
    }
}

जो आप तब आंशिक दृश्य में इस तरह प्रयोग कर सकते हैं:

@{
    DeferredScripts.Add("/scripts/testscript1.js");
}

और इसे अपने लेआउट में (या एक दृश्य पृष्ठ में) का उपयोग करें:

@foreach (var script in DeferredScripts.Scripts)
{
    @Html.Raw(script)
}

मैं एक साथ फेंक दिया गया परीक्षण प्रोजेक्ट में काम करने लगता है: https://github.com/tiesont/DeferredScriptsTestApp

टेलरिक में उनके केंडोयूआई एएसपी.NET एमवीसी मददकर्ताओं के लिए कुछ समान है, हालांकि मैं मानता हूं कि उनके कार्यान्वयन को मैंने जो दिखाया है उससे ज्यादा मजबूत है।


आप लेआउट पृष्ठ पर एक आंशिक सिग्नल बना सकते हैं, जिसमें आईओसी स्कॉप्ड या एचटीटीपी कॉन्टैक्ट बैग का उपयोग करके उदाहरण के लिए स्क्रिप्ट शामिल होनी चाहिए। जो लेआउट पृष्ठ द्वारा पढ़ा जाता है।

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

एक बेहतर तरीका है कि आप अपनी तरह के दृश्य संमिश्र बनाने (या उनका विस्तार करें) और आवश्यक दृश्यों को निर्दिष्ट करने के लिए एक विकल्प बनाते हैं। आईओसी शीर्ष पर इन घटकों और उन्हें जहां आवश्यक प्रदान करता है

बेहतर समाधान

एक बेहतर समाधान होगा, अगर पेजों की आधी हिस्से को यह मुख्य बंडल के अंदर बंडल करने के लिए जावा-स्क्रिप्ट की आवश्यकता होती है। मिनेइफ़र शायद अधिक चर को कम करने में सक्षम होगा, और उपयोगकर्ता को पृष्ठ लोड होने के लिए 1 कम स्क्रिप्ट (http अनुरोध) का अनुरोध करना होगा, इस प्रकार कम ट्रैफ़िक बनाना, तेज पृष्ठ लोड बनाना, बेहतर उपयोगकर्ता अनुभव बनाना





asp.net-core