ASP.NET MVC - बंडल कॉन्फिग ऑर्डर


84

मैं अपने ASP.NET MVC 5 एप्लिकेशन में एक विशिष्ट लोकेल (es-CL) का उपयोग करने की कोशिश कर रहा हूं। मैं निम्नलिखित है:

  1. "Es-CL" के लिए परिवर्तित वेब.कॉन्फ़िग यूकल्चर और कल्चर
  2. Globalize और jQuery.Validation.Globalize संकुल स्थापित किया
  3. मेरे विचारों में डिफ़ॉल्ट भाषा को बदल दिया: <html lang="es-cl">
  4. एक नया बंडल बनाया और उपयुक्त दृश्यों में शामिल किया।

में BundleConfig.cs :

bundles.Add(new ScriptBundle("~/bundles/jqueryval")
    .Include("~/Scripts/jquery.validate.js")
    .Include("~/Scripts/jquery.validate.unobtrusive.js"));

bundles.Add(new ScriptBundle("~/bundles/globalization")
    .Include("~/Scripts/globalize/globalize.js")
    .Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
    .Include("~/Scripts/jquery.validate.globalize.js"));

उपयुक्त विचारों में:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/globalization")
}

हालाँकि, उत्पन्न स्रोत कोड निम्नलिखित है:

<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>

<script src="/Scripts/jquery.validate.globalize.js"></script>
<script src="/Scripts/globalize/globalize.js"></script>
<script src="/Scripts/globalize/cultures/globalize.culture.es-CL.js"></script>

कृपया ध्यान दें कि वैश्वीकरण से पहले jquery.validate.globalize.js स्क्रिप्ट लोड की जा रही है।

ये क्यों हो रहा है? क्या एकल बंडल में शामिल आदेश में भरोसा करना संभव है, या क्या मुझे इस एकल स्क्रिप्ट को एक अलग बंडल में रखने और इसे मेरे विचार में निर्दिष्ट करने के लिए मजबूर किया गया है?


1
इस सवाल पर एक नज़र रखना है stackoverflow.com/questions/11979718/…
पॉल मैककावाट

@PaMMcCowat हाँ, लेकिन मैं अभी तक की मिनिमाइज़ किए गए संस्करणों का उपयोग नहीं कर रहा हूँ। मैं Microsoft.AspNet.Web.Optimifications 1.1.0 का उपयोग कर रहा हूं।
लियोनार्डो हरेरा

@ लियोनार्डो हेरेरा मुझे लगता है कि यह क्रिस की तरह उनकी टिप्पणियों में उल्लिखित है, कि ज्ञात फ़ाइलों को बंडलर द्वारा निर्दिष्ट आदेश के आसपास स्थानांतरित कर दिया जाता है ... लेकिन मुझे यकीन नहीं हो सकता है क्योंकि मुझे नहीं पता कि वे फाइलें क्या हैं, जिसके कारण मुझे पूछना है । मुझे यह जानने में दिलचस्पी होगी कि क्या ऑर्डर निर्दिष्ट नहीं करने के बाद से आपके लिए IBundleOrderer काम करता है।
माइकस्मिथडेव

[इस लिंक] [1] [१] में देखें @Softlion जवाब: stackoverflow.com/questions/11979718/…
ओमिड-आरएच

@section Scripts { @Scripts.Render("~/bundles/jqueryval") }प्रतीत होता है मेरी स्क्रिप्ट के मुद्दे को आदेश से बाहर लोड हो रहा है ....
petrosmm

जवाबों:


103

डिफ़ॉल्ट रूप से, बंडलिंग ऑर्डर वाइल्डकार्ड वाले नामों के लिए वर्णमाला है (जैसा कि टिप्पणियों में बताया गया है)। हालाँकि, यह इस पर भी आदेश देता है कि यह आपके निर्भरता के पेड़ के बारे में क्या सोचता है, और jQueryलिपियाँ शीर्ष पर खिसकी हुई लगती हैं। आपको एक ऐसी वस्तु बनाने की आवश्यकता है जो कार्यान्वित हो IBundleOrder:

class NonOrderingBundleOrderer : IBundleOrderer
{
    public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
    {
        return files;
    }
}

यह डिफॉल्ट ऑर्डर को रोकता है। अब इसका उपयोग करने के लिए:

var bundle = new ScriptBundle("~/bundles/globalization")
    .Include("~/Scripts/globalize/globalize.js")
    .Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
    .Include("~/Scripts/jquery.validate.globalize.js");

bundle.Orderer = new NonOrderingBundleOrderer();

bundles.Add(bundle);

रेफरी: http://stevescodingblog.co.uk/changing-the-ordering-for-single-bundles-in-asp-net-4/

आगे पढ़ने के लिए, माइकस्मिथडेव के प्रश्न का उत्तर लोकप्रिय स्क्रिप्ट पुस्तकालयों के लिए डिफ़ॉल्ट क्रम में और अंतर्दृष्टि प्रदान करता है:

एक बंडल के भीतर फाइल का आदेश - ज्ञात पुस्तकालय क्या हैं?


नाइटपिक के लिए नहीं, लेकिन "डिफ़ॉल्ट रूप से, बंडलिंग ऑर्डर वर्णानुक्रमिक है" सच है जब आप वाइल्ड कार्ड जैसी चीजों का उपयोग करते हैं ... जब आप ऑर्डर निर्दिष्ट करते हैं, जैसे कि उसके पास है, तो उसे अपने ऑर्डर का उपयोग करना चाहिए। मैं केवल यह मान सकता हूं कि बंडलकर्ता ज्ञात फ़ाइल प्रकारों के आसपास घूम रहा है और उसके आदेश की अनदेखी कर रहा है।
माइकस्मिथडेव

ऐसा लगता है कि बंडलर भी निर्भरता के बारे में कुछ तर्क का उपयोग करके आदेश देता है। यह सोचता है कि jquery.validate.globalize.jsअन्य दो के लिए आवश्यक है। रेफ से: "[बंडलर] को पहले से ही बंडल में ज्ञात फ्रेमवर्क की फाइलें, जैसे कि jQuery या प्रोटोटाइप स्क्रिप्ट में डालनी होगी, यह सुनिश्चित करने के लिए कि वे आपके ही कोड से पहले चलते हैं जो उनके प्रकारों का उपयोग करता है"
मिस्टर एलिक

3
स्थानिक क्रम है: jquery.js jquery-min.js jquery- * jquery-ui * jquery.ui * jquery.unobtrusive * jquery.validate- "आधुनिक मिज़ाज़- * डोज़ो। * मूटोल्स-कोर * मटोलस- * प्रोटोटाइप-ज्स प्रोटोटाइप * स्क्रिप्टैकुलस- * ext.js ext- *
रावंडल

6
यहाँ वह जगह है जहाँ प्रोग्रामिंग मजेदार नहीं है। वीएस इसे जटिल क्यों बनाते हैं?
जैदर

5
तथ्य यह है कि यह मौजूद है कि यह कितना बेवकूफ है। वास्तव में .. बंडलर बेहतर जानता है कि मैंने अपनी निर्भरता को बेहतर कैसे ऑर्डर किया है? Gulp.js (या यहां तक ​​कि ग्रंट) FTW!
जॉन कुल्विनर

30

MVC 5 के अंतिम संस्करण में (2014 के 27 अक्टूबर को), यो को इस वर्ग का उपयोग करना चाहिए:

class AsIsBundleOrderer : IBundleOrderer
{
    public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
    {
        return files;
    }
}

और दूसरी प्रतिक्रिया की तरह बंडल बनाएं:

var bundle = new ScriptBundle("~/bundles/globalization")
.Include("~/Scripts/globalize/globalize.js")
.Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
.Include("~/Scripts/jquery.validate.globalize.js");

bundle.Orderer = new AsIsBundleOrderer();

bundles.Add(bundle);

मुझे यह जानकारी कहां मिल सकती है? क्या आप कृपया एक लिंक प्रदान कर सकते हैं?
पूसइन्बूट्स 14

मैं बस इस प्रश्न के लिए वर्तमान प्रतिक्रिया की विधि का उपयोग करने की कोशिश करता हूं, लेकिन मुझे ASP.NET MVC 5 में एक त्रुटि के साथ अपना स्वयं का पता चला, इसलिए मैं IBundleOrderer इंटरफ़ेस की जांच करता हूं और परिवर्तन करता हूं
सेबेस्टियन रोजास

कोई आदेशक संपत्ति नहीं है। मैं MVC 5.2.x
लीजेंड्स

1
मैं इसे MVC 5.2.3 के साथ परीक्षण करता हूं और तेहरस ऑर्डरर प्रॉपर्टी है।
सेबेस्टियन रोजस

28

बंडल बनाने के दौरान कोड को कम करने के लिए , मेरा सुझाव है कि आप एक विस्तार विधि बनाएं।

बुनियादी सुविधाओं के वर्गों की आवश्यकता:

class NonOrderingBundleOrderer : IBundleOrderer
{
    public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
    {
        return files;
    }
}


static class BundleExtentions
{
    public static Bundle NonOrdering(this Bundle bundle)
    {
        bundle.Orderer=new NonOrderingBundleOrderer();
        return bundle;
    }
}

अब बस इसे इस तरह उपयोग करें:

सभी एक आदेश में 😎

bundles.Add(new ScriptBundle("~/bundles/jqueryval")
               .NonOrdering()
               .Include(
                    "~/Scripts/globalize/globalize.js",
                    "~/Scripts/globalize/cultures/globalize.culture.es-CL.js",
                    //...
                );

1
सोचने का अच्छा तरीका!
अरुणा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.