2009-06-02 6 views
28

किसी को .js फ़ाइल में संग्रहीत जावास्क्रिप्ट कोड में resx संसाधन स्ट्रिंग कैसे प्राप्त होंगी?जावास्क्रिप्ट फ़ाइलों के भीतर से ASP.NET संसाधन स्ट्रिंग का उपयोग करें

अपने जावास्क्रिप्ट मार्कअप में एक स्क्रिप्ट ब्लॉक में है, तो आप इस वाक्य विन्यास का उपयोग कर सकते हैं:

<%$Resources:Resource, FieldName %> 

और यह के रूप में यह पेज renders ... दुर्भाग्य में संसाधन मान पार्स जाएगा, कि केवल होगा पेज के बॉडी में जावास्क्रिप्ट दिखाई देने पर पार्स किया जाए। < स्क्रिप्ट > टैग में संदर्भित बाहरी .js फ़ाइल में, उन सर्वर टैगों को स्पष्ट रूप से कभी भी पार्स नहीं किया जाता है।

मैं उन संसाधनों या कुछ भी वापस करने के लिए स्क्रिप्ट सेवा लिखना नहीं चाहता, क्योंकि वे पृष्ठ के बाद परिवर्तित नहीं होते हैं, इसलिए यह सक्रिय है कि यह सक्रिय है।

एक संभावना एशक्स हैंडलर लिखने और < स्क्रिप्ट > टैग को इंगित करने के लिए हो सकती है, लेकिन मुझे अभी भी यकीन नहीं है कि मैं .js फ़ाइलों में कैसे पढ़ूंगा और टेक्स्ट स्ट्रीम करने से पहले किसी भी सर्वर टैग को पार्स करूँगा ग्राहक के लिए। क्या कोड की एक पंक्ति है जिसे मैं चला सकता हूं जो कि एएसपी.NET पार्सर के समान कार्य करेगा?

या क्या किसी के पास कोई अन्य सुझाव है?

उत्तर

19

इसके लिए कोई मूल समर्थन नहीं है।

मैंने कुछ समय पहले एक जावास्क्रिप्ट संसाधन संसाधन बनाया था जो क्लाइंट पेज में ऑब्जेक्ट्स के माध्यम से सर्वर पेज में सेवा कर सकता है जहां ऑब्जेक्ट पर प्रत्येक प्रॉपर्टी स्थानीयकरण संसाधन आईडी और उसके मान का प्रतिनिधित्व करती है। यह तो आपको देखना कर सकते हैं और इस ब्लॉग पोस्ट से डाउनलोड:

http://www.west-wind.com/Weblog/posts/698097.aspx

मैं क्षुधा की संख्या में बड़े पैमाने पर इस का उपयोग किया गया है और यह अच्छी तरह से काम करता है। इस पर मुख्य जीत यह है कि आप कई स्थानीयकरण योजनाओं के बजाय अपने संसाधनों को एक ही स्थान पर स्थानांतरित कर सकते हैं (Resx या मेरे मामले में एक डेटाबेस का उपयोग कर कस्टम संसाधन प्रदाता)।

+0

हम्म, एक दिलचस्प दृष्टिकोण। मेरे लिए काम कर सकता है। दोष यह है कि मेरे पास केवल एक ही संसाधन फ़ाइल है जिसके लिए मैं बाहर निकलना चाहता हूं या अन्यथा कोई उपयोग नहीं कर रहा हूं ... और मैं ' एम शेयरपॉइंट के अंदर, इसलिए फ़ाइल के रूप में resx को पढ़ना और इसे पार्स करना एक समस्या हो सकती है, हम देखेंगे। पोस्ट के लिए धन्यवाद! – Grank

0

मैं आमतौर पर संसाधन स्ट्रिंग को जो भी जावास्क्रिप्ट फ़ंक्शन कॉल कर रहा हूं, उसके पैरामीटर के रूप में पास करता हूं, इस तरह मैं HTML में अभिव्यक्ति वाक्यविन्यास का उपयोग करना जारी रख सकता हूं।

+0

कि सामान्य रूप से मेरी झुकाव के रूप में अच्छी तरह से हो सकता है, लेकिन इस मामले में, यह एक ग्राहक के पक्ष आइटम एक RadMenu के लिए हैंडलर क्लिक किया है, इसलिए इसमें 7 मामलों के साथ एक स्विच बयान की ओर जाता है, सभी अलग प्रदर्शित "क्या आपको यकीन है?" तार :( – Grank

2

संक्षेप में, एएसपी.NET एक विशिष्ट पृष्ठ के लिए HTML की बजाय जावास्क्रिप्ट की सेवा करें। एक कस्टम IHttpHandler के रूप में किया जाने वाला सबसे साफ, लेकिन एक चुटकी में एक पृष्ठ होगा, बस याद रखें:

1) सभी एएसपी.नेट सामग्री साफ़ करें और इसे जेएस फ़ाइल की तरह दिखें।

2) कोड-प्रकार में सामग्री-प्रकार को "टेक्स्ट/जावास्क्रिप्ट" पर सेट करें।

एक बार जब आप इस सेटअप की तरह एक स्क्रिप्ट प्राप्त कर लेते हैं, तो आप अपने संसाधनों की क्लाइंट-साइड कॉपी बना सकते हैं जो अन्य क्लाइंट-साइड स्क्रिप्ट आपके ऐप से संदर्भित कर सकते हैं।

0

मैं ब्राउन फील्ड एप्लिकेशन पर काम कर रहा हूं, हमारे पास एक xslt है जो निर्माण प्रक्रिया के हिस्से के रूप में resx फ़ाइल को जावास्क्रिप्ट फ़ाइल में बदल देता है। यह अच्छी तरह से काम करता है क्योंकि यह एक वेब अनुप्रयोग है। मुझे यकीन नहीं है कि मूल प्रश्न एक वेब एप्लिकेशन है या नहीं।

4

जबकि "सामान्य" संसाधन फ़ाइल का नाम है और Msg1 फ़ील्डनाम है। यह संस्कृति परिवर्तनों के लिए भी काम करता है।

  Partial Javascript...: 
      messages: 
      { 
       <%=txtRequiredField.UniqueID %>:{      
        required: "<%=Resources.Common.Msg1 %>", 
        maxlength: "Only 50 character allowed in required field." 
       } 
      } 
+0

धन्यवाद! सही काम करता है। 'कोड अलर्ट ("<% = Resources.LocalizedText.ErrorMessage%> ");' – Equiman

0

उपयोग एक छिपी हुई फ़ील्ड संसाधन स्ट्रिंग मान रखें और फिर उपयोग करने के लिए फ़ील्ड मान उदाहरण के लिए जावास्क्रिप्ट में: "/>

वर todayString = $ (" इनपुट [नाम = TodayString] [ type = छिपा] ") वैल();।।

32

यहाँ अब के लिए मेरे समाधान है मुझे यकीन है कि मैं भविष्य में इसे और अधिक बहुमुखी करने की आवश्यकता होगी हूँ ... लेकिन अब तक यह अच्छा है

using System.Collections; 
using System.Linq; 
using System.Resources; 
using System.Web.Mvc; 
using System.Web.Script.Serialization; 

public class ResourcesController : Controller 
{ 
    private static readonly JavaScriptSerializer Serializer = new JavaScriptSerializer(); 

    public ActionResult GetResourcesJavaScript(string resxFileName) 
    { 
     var resourceDictionary = new ResXResourceReader(Server.MapPath("~/App_GlobalResources/" + resxFileName + ".resx")) 
          .Cast<DictionaryEntry>() 
          .ToDictionary(entry => entry.Key.ToString(), entry => entry.Value.ToString()); 
     var json = Serializer.Serialize(resourceDictionary); 
     var javaScript = string.Format("window.Resources = window.Resources || {{}}; window.Resources.{0} = {1};", resxFileName, json); 

     return JavaScript(javaScript); 
    } 

} 

// In the RegisterRoutes method in Global.asax: 
routes.MapRoute("Resources", "resources/{resxFileName}.js", new { controller = "Resources", action = "GetResourcesJavaScript" }); 

तो मैं

<script src="/resources/Foo.js"></script> 

और फिर मेरी स्क्रिप्ट संदर्भित कर सकते हैं कर सकते हैं जैसे कि window.Resources.Foo.Bar और एक स्ट्रिंग प्राप्त करें।

+0

मैं फ्रेमवर्क 4 का उपयोग करता हूं, मेरा ऐप वेब है, मुझे "ResXResourceReader" विधि को हल करने के लिए System.Windows.Forms.dll का संदर्भ जोड़ना है। मैं "संसाधन नियंत्रक" में प्रवेश नहीं कर सकता, संसाधन नियंत्रक वर्ग App_GlobalResources फ़ोल्डर में है। मैंने resx फ़ाइल को बिल्ड एक्शन: संसाधन के रूप में सेट किया है। मैंने ब्रेकपॉइंट और कुछ भी नहीं रखा है। –

+0

जेएसओएन को क्रमबद्ध करने के लिए क्लास को 'जावास्क्रिप्टसेरियलाइज़र' कहा जाता है, न कि 'सीरिएलाइज़र' और यह स्थिर नहीं है। – modiX

+0

मैं इसका उपयोग करने की कोशिश कर रहा हूं, लेकिन मैं नियंत्रक में कभी नहीं पहुंच रहा हूं। मेरे पास कार्रवाई में ब्रेक प्वाइंट है लेकिन यह वहां कभी नहीं पहुंचता है। प्लस _ _ यह _layout.chtml फ़ाइल में जोड़ा जा रहा है? – mohsinali1317

0

यह आलेख कुछ परिदृश्यों पर चर्चा करता है और एक अच्छे समाधान का वर्णन करता है जो डोमेनिक के उत्तर के समान ही है। http://michael-sander.eu/index.php/2010/07/29/using-localized-resources-in-javascript-files-in-a-asp-mvc-project/comment-page-1/#comment-219

+0

लिंक मृत लगता है। क्या कोई अद्यतन है? – smoksnes

0

यदि आपके पास एक अलग असेंबली में आपके संसाधन हैं तो आप फ़ाइल नाम के बजाय ResourceSet का उपयोग कर सकते हैं। @Domenics महान जवाब पर निर्माण:

public class ResourcesController : Controller 
{ 
    private static readonly JavaScriptSerializer Serializer = new JavaScriptSerializer(); 

    public ActionResult GetResourcesJavaScript() 
    { 
     // This avoids the file path dependency. 
     ResourceSet resourceSet = MyResource.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true); 

     // Create dictionary. 
     var resourceDictionary = resourceSet 
         .Cast<DictionaryEntry>() 
         .ToDictionary(entry => entry.Key.ToString(), entry => entry.Value.ToString()); 
     var json = Serializer.Serialize(resourceDictionary); 
     var javaScript = string.Format("window.Resources = window.Resources || {{}}; window.Resources.resources = {1};", json); 

     return JavaScript(javaScript); 
    } 
} 

नकारात्मक पक्ष यह है कि इस कार्रवाई के एक से अधिक संसाधन फ़ाइल सक्षम नहीं होगा। इस तरह @Domenics उत्तर अधिक सामान्य और पुन: प्रयोज्य है।

आप OutputCache का उपयोग करने पर भी विचार कर सकते हैं, क्योंकि संसाधन अनुरोधों के बीच बहुत कुछ नहीं बदलेगा।

[OutputCache(Duration = 3600, Location = OutputCacheLocation.ServerAndClient)] 
public ActionResult GetResourcesJavaScript() 
{ 
    // Logic here... 
} 

http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/improving-performance-with-output-caching-cs

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