दिलचस्प पोस्ट
मापदंडों के बिना एसक्यूएल इंजेक्शन से बचना जावा में स्पष्ट स्क्रीन विकल्प HTML सूची-शैली-प्रकार डैश कार्यक्षेत्र संरेखण तालिका-सेल स्थिति पूर्ण के साथ काम नहीं करते मैं .NET Framework के साथ ईमेल पता स्वरूपण कैसे मान्य करूं? PowerShell में असेंबलियों को कैसे लोड करें? नामांकित नियमित अभिव्यक्ति समूह "(? पी <group_name> regexp)": "पी" क्या है? XML फ़ाइल में पार्स किए गए और बदलना DOM दस्तावेज़ को कैसे सहेजें? Ggplot2 के साथ लैटिक डेन्ड्रोग्राम ग्राफ़ को पुन: प्रजनन करना बैच फ़ाइल में वाइल्डकार्ड से मेल खाने वाली फ़ाइलों के माध्यम से लूप कैसे करें आरजीबी को ग्रेस्केल / तीव्रता में परिवर्तित करना प्रपत्र प्रमाणन समयबाह्य बनाम सत्र कालबाह्य जावा में, दो वर्णों को एक इंट या एक चार जोड़ के परिणाम हैं? मैं समय के बाद के समय के बाद एक लूप कैसे रोकूँगा? Stdafx.h का उद्देश्य

asp.net-mvc: रेजर '@' प्रतीक जेएस फ़ाइल में

मेरे पास एक। .csHtml -razor फ़ाइल है जो जावास्क्रिप्ट फ़ंक्शन के साथ जो @Url.Content C # फ़ंक्शन के अंदर @Url.Content यूआरएल के लिए उपयोग करता है।
मैं उस फ़ंक्शन को मेरे दृश्य से संदर्भित एक .js फ़ाइल में ले जाना चाहता हूं।

समस्या यह है कि जावास्क्रिप्ट @ चिह्न "पता" नहीं है और सी # कोड को पार्स नहीं करता है।
"।" प्रतीक के साथ दृश्य से संदर्भ .js फाइल करने का कोई तरीका क्या है?

Solutions Collecting From Web of "asp.net-mvc: रेजर '@' प्रतीक जेएस फ़ाइल में"

आप HTML5 data-* विशेषताओं का उपयोग कर सकते हैं मान लीजिए कि आप कुछ क्रिया करने के लिए चाहते हैं जब कुछ डीओएम तत्व जैसे कि एक div पर क्लिक किया जाता है। इसलिए:

 <div id="foo" data-url="@Url.Content("~/foobar")">Click me</div> 

और फिर अपनी अलग जावास्क्रिप्ट फ़ाइल में आप बिना किसी विवादास्पद काम कर सकते हैं DOM:

 $('#foo').click(function() { var url = $(this).data('url'); // do something with this url }); 

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

खैर मैंने सिर्फ एक रेजर इंजन को नूगेट पर पाया है जो यह करता है! मतलब @ वाक्यविन्यास हल करता है!
इसका नाम रेज़रज एस है

Nuget पैकेज


2016 अद्यतन:
पैकेज 5 वर्षों के लिए अपडेट नहीं किया गया था, और परियोजना साइट लिंक मर चुका है। मैं लोगों को अब इस पुस्तकालय का उपयोग करने की अनुशंसा नहीं करता।

समस्या से निपटने का एक तरीका यह है:

दृश्य में जावास्क्रिप्ट कार्यों के साथ एक आंशिक दृश्य जोड़ना
इस तरह आप @ प्रतीक का उपयोग कर सकते हैं और आपके सभी javascript कार्यों को दृश्य से अलग किया जाता है।

आपके पास दो विकल्प हैं:

  • फ़ंक्शन में पैरामीटर के रूप में मान का प्रयोग करें और दृश्य में वायर-अप का उपयोग करें
  • नामस्थान बनाएं (सार्वजनिक स्तर की चर के बजाय जो कि जेएस में बुरा व्यवहार माना जाता है) और इस मान को पृष्ठ के शीर्ष पर सेट करें और फिर इसे अपने जेएस में प्रयोग करें

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

  var MyCompany = { MyProject: { MyVariable:"" } }; 

और फिर आपके विचार में, इसे सेट करें:

 MyCompany.MyProject.MyVariable = @.... 

अद्यतन करें

आप सोच सकते हैं कि युग्मन की वजह से कोई भी अच्छा नहीं है, यह सच है, आप जे एस को जोड़ रहे हैं और देखें। यही कारण है कि लिपियों को उस स्थान से अनजान होना चाहिए, जो वे चल रहे हैं, इसलिए यह फाइलों के गैर-इष्टतम संगठन का एक लक्षण है।

वैसे भी एक दृश्य इंजन बनाने और रेजर के खिलाफ जेएस फाइल चलाने और परिणाम वापस भेजने का एक तीसरा विकल्प है। यह क्लीनर है, लेकिन बहुत धीमी है, इसलिए इसकी सिफारिश नहीं की गई है।

अपनी जेएस फ़ाइल में @ वैरिएबल प्राप्त करने के लिए आपको एक वैश्विक चर का उपयोग करना होगा और उस वैरिएबल को उस एमवीसी दृश्य से सेट करना होगा जो कि .js फ़ाइल का उपयोग कर रहा है।

जावास्क्रिप्ट फ़ाइल:

 var myValue; function myFunc() { alert(myValue); } 

एमवीसी फ़ाइल देखें:

 <script language="text/javascript"> myValue = @myValueFromModel; </script> 

बस सुनिश्चित करें कि आपके फ़ंक्शन को किसी भी कॉल के बाद दृश्य के अनुसार मूल्य निर्धारित किया गया है।

शायद यह सही दृष्टिकोण नहीं है चिंताओं की जुदाई को ध्यान में रखते हुए आपके पास JavaScript क्लास पर data injector होना चाहिए और जो अधिकतर मामलों में है JSON

अपने script फ़ोल्डर में जेएस फ़ाइल बनाएं और इस संदर्भ को अपने View जोड़ें

 <script src="@Url.Content("~/Scripts/yourJsFile.js")" type="text/javascript"></script> 

अब, अपनी yourJsFile.js में JavaScript शाब्दिक वर्ग पर विचार करें:

 var contentSetter = { allData: {}, loadData: function (data) { contentSetter.allData = eval('(' + data + ')'); }, setContentA: function () { $("#contentA").html(allData.contentAData); }, setContentB: function () { $("#contentB").html(allData.contentAData); } }; 

इसके अलावा एक वर्ग घोषित करें

 public class ContentData { public string ContentDataA { get; set } public string ContentDataB { get; set } } 

अब, आपकी Action ऐसा करें:

 public ActionResult Index() { var contentData = new ContentData(); contentData.ContentDataA = "Hello"; contentData.ContentDataB = "World"; ViewData.Add("contentData", contentData); } 

और आपके विचार से:

 <div id="contentA"></div> <div id="contentB"></div> <script type="text/javascript"> contentSetter.loadData('@Json.Encode((ContentData) ViewData["contentData"])'); contentSetter.setContentA(); contentSetter.setContentB(); </script> 

मैंने हाल ही में इस विषय के बारे में लिखा है: आंशिक रेज़र दृश्यों का उपयोग करते हुए बाहरी जावास्क्रिप्ट फाइलों को उत्पन्न करना ।

मेरा समाधान कस्टम एट्रिब्यूट ( ExternalJavaScriptFileAttribute जावास्क्रिप्टफ़ाइल एट्रिब्यूट) का उपयोग करना है जो एक आंशिक रेज़र व्यू को रेखांकित करता है और फिर आसपास <script> टैग्स के बिना देता है इससे यह एक वैध बाहरी जावास्क्रिप्ट फाइल बनाता है

मैं आमतौर पर कार्यों में मॉडल गुणों तक एक्सेस करने के लिए जेएस को लपेटता हूं और फिर दृश्य में कुछ चीज़ों को पास करता हूं। उदाहरण के लिए

 <script type="text/javascript"> function MyFunction(somethingPresentInTheView) { alert(somethingPresentInTheView); } </script> 

दृश्य में मैं (सिर्फ एक उदाहरण) के माध्यम से फ़ंक्शन आह्वान जोड़ता हूं:

 <input type='button' onclick="MyFunction('@Model.PropertyNeeded')" /> 

मुझे लगता है कि आपको उस जेएस कोड को व्यू में डाल दिया गया है। रेज़र पार्सर, जहां तक ​​मुझे पता है, जेएस फाइलों को नहीं देखेगी, इस प्रकार आपके पास जो भी काम करता है वह @ काम नहीं करेगा। प्लस, जैसा कि आप देख चुके हैं, जावास्क्रिप्ट स्वयं को किसी भी कारण के लिए चारों ओर लटकने वाले इस @ अक्षर को पसंद नहीं करता है, दूसरे, फिर एक स्ट्रिंग में कहते हैं।