2013-01-04 11 views
7

मैं एमवीसी के लिए नया हूं।होस्ट नाम से एमवीसी 4 बंडल

मैं जानता हूँ कि बंडलों बनाने का तरीका है, यह आसान है और यह एक महान विशेषता है:

bundles.Add(new StyleBundle("~/content/css").Include(
    "~/content/main.css", 
    "~/content/footer.css", 
    "~/content/sprite.css" 
    )); 

लेकिन मान लें कि आपका आवेदन अलग डोमेन के अंतर्गत सुलभ और विभिन्न सीएसएस होस्ट नाम के आधार पर अलग अलग सामग्री की सेवा कर रही है।

होस्ट बंडल के आधार पर आपके पास बंडल में अलग-अलग फाइलें कैसे शामिल हो सकती हैं? एप्लिकेशन में शुरू करें जहां मेरा रजिस्टरबंडल्स है (जैसे एमवीसी मानक इंटरनेट एप्लिकेशन में मैंने शुरुआत की थी) मुझे अभी तक होस्ट नाम भी नहीं पता है।

सर्वोत्तम प्रथाओं क्या हैं?

यदि मेरे पास बंडल पंजीकृत करते समय होस्ट नाम उपलब्ध था तो मैं वर्तमान होस्ट नाम के लिए सही .css फ़ाइल चुन सकता था। क्या मैं उदाहरण के लिए आवेदन शुरू करने के अनुरोध पर बंडल पंजीकृत कर सकता हूं, और किसी भी तरह से जांच कर सकता हूं कि यह पहले से पंजीकृत है या नहीं, तो अनुरोध के होस्ट नाम के लिए सही फाइलें चुनें और इसे पंजीकृत करें?

यदि हां, तो कैसे?

संपादित करें 1

पिछले दो घंटे मैं इस विषय की अधिक बेहतर जांच में, मुझे उम्मीद है कि जो MVC के साथ मुझसे अधिक विशेषज्ञ मेरी दृष्टिकोण सही कर सकते हैं, तो गलत है के साथ अपने समाधान प्रस्तावित करते हैं।

मैं बदले गए:

साथ
@Styles.Render("~/Content/css") 

:

@Html.DomainStyle("~/Content/css") 

कौन सा बस एक साधारण सहायक है:

public static class HtmlExtensions 
{ 
    public static IHtmlString DomainStyle(this HtmlHelper helper, string p) 
    { 
    string np = mynamespace.BundleConfig.RefreshBundleFor(System.Web.Optimization.BundleTable.Bundles, "~/Content/css"); 

    if (!string.IsNullOrEmpty(np)) 
     return Styles.Render(np); 
    else 
    { 
     return Styles.Render(p); 
    } 
    } 
} 

RefreshBundleFor कहां है:

public static string RefreshBundleFor(BundleCollection bundles, string p) 
{ 
    if (bundles.GetBundleFor(p) == null) 
    return null; 

    string domain = mynamespace.Utilities.RequestUtility.GetUpToSecondLevelDomain(HttpContext.Current.Request.Url); 

    string key = p + "." + domain; 

    if (bundles.GetBundleFor(key) == null) 
    { 
    StyleBundle nb = new StyleBundle(key); 

    Bundle b = bundles.GetBundleFor(p); 
    var bundleContext = new BundleContext(new HttpContextWrapper(HttpContext.Current), BundleTable.Bundles, p); 

    foreach (FileInfo file in b.EnumerateFiles(bundleContext)) 
    { 
     string nf = file.DirectoryName + "\\" + Path.GetFileNameWithoutExtension(file.Name) + "." + domain + file.Extension; 
     if (!File.Exists(nf)) 
     nf = file.FullName; 

     var basePath = HttpContext.Current.Server.MapPath("~/"); 
     if (nf.StartsWith(basePath)) 
     { 
     nb.Include("~/" + nf.Substring(basePath.Length)); 
     } 
    } 
    bundles.Add(nb); 
    } 

    return key; 
} 

और GetUpToSecondLevelDomain मेजबान नाम से दूसरे स्तर के डोमेन को वापस कर रहा है, इसलिए GetUpToSecondLevelDomain ("www.foo.bar.com") = "bar.com"।

यह कैसा है?

उत्तर

3

अधिक जटिल - अनुरोध ऑब्जेक्ट Application_Start में उपलब्ध है। बस का उपयोग करें:

var host = Request.Url.Host; 

इससे पहले कि आप अपने बंडल रजिस्टर और सशर्त रजिस्टर अपने बंडल आधार पर मान दिया।

अद्यतन रजिस्टर सब आप एक डोमेन कुंजी के साथ बंडल:

var host = Request.Url.Host; // whatever code you need to extract the domain like Split('.')[1] 
ViewBag.BundleName = string.Format("~/content/{0}.css", host); 
:

StyleBundle("~/content/foo1.css")... 
StyleBundle("~/content/foo2.css")... 
फिर एक आधार नियंत्रक कि सभी नियंत्रकों के वारिस आप बंडल नाम का निर्माण देखने के लिए पारित करने के लिए कर सकते हैं में

और उसके बाद लेआउट या दृश्य में:

@Styles.Render(ViewBag.BundleName) 
+0

लेकिन मुझे संदेह है कि यह पर्याप्त नहीं है। एप्लिकेशन_स्टार्ट को तब ही कॉल किया जाता है जब एप्लिकेशन प्रारंभ होता है, उसी एप्लिकेशन पर एकाधिक डोमेन का अर्थ है कि यह किसी एक डोमेन से पहले अनुरोध पर शुरू होता है, लेकिन अन्य डोमेन से बाद के अनुरोधों पर? –

+0

आप प्रत्येक प्रतिक्रिया पर बंडल और ऑप्टिमाइज़ करने की कोशिश कर रहे CPU समय का एक टन खाने जा रहे हैं, आपकी प्रतिक्रिया को धीमा करने और बंडलिंग/कम करने के उद्देश्य को हरा करने से अधिक। सही बंडल चुनने के लिए लेआउट और/या नियंत्रक का उपयोग करके आप अपने सभी डोमेन विशिष्ट बंडलों को एक बार और फिर कम करने/कम करने से बेहतर होंगे। – viperguynaz

+0

मैं इसे लेआउट में करने की सलाह दूंगा, बयान में कुछ सरल और आप कर चुके हैं। मैं लेआउट, व्यू इत्यादि में तर्क का प्रशंसक नहीं हूं, लेकिन यह एक अच्छा अपवाद है। –

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