उत्तर की सामग्री
1) जावास्क्रिप्ट / Jquery कोड ब्लॉक में मॉडल डेटा को .cshtml
फ़ाइल में कैसे एक्सेस करें
2) .js
फ़ाइल में जावास्क्रिप्ट / जक्वेरी कोड ब्लॉक में मॉडल डेटा का उपयोग कैसे करें
.cshtml
फ़ाइल में जावास्क्रिप्ट / जक्वेरी कोड ब्लॉक में मॉडल डेटा का उपयोग कैसे करें
Model
जावास्क्रिप्ट चर के लिए दो प्रकार के सी # चर ( ) असाइनमेंट हैं।
- संपत्ति काम - मूल डेटाटाइप्स चाहते
int
, string
, DateTime
(पूर्व: Model.Name
)
- वस्तु काम - कस्टम या इनबिल्ट वर्गों (पूर्व:
Model
, Model.UserSettingsObj
)
आइए इन दोनों असाइनमेंट के विवरण पर ध्यान दें।
शेष उत्तर के लिए नीचे दिए गए AppUser
मॉडल को एक उदाहरण के रूप में मानें।
public class AppUser
{
public string Name { get; set; }
public bool IsAuthenticated { get; set; }
public DateTime LoginDateTime { get; set; }
public int Age { get; set; }
public string UserIconHTML { get; set; }
}
और जिन मूल्यों को हम इस मॉडल को निर्दिष्ट करते हैं वे हैं
AppUser appUser = new AppUser
{
Name = "Raj",
IsAuthenticated = true,
LoginDateTime = DateTime.Now,
Age = 26,
UserIconHTML = "<i class='fa fa-users'></i>"
};
संपत्ति का काम
असाइनमेंट के लिए विभिन्न सिंटैक्स का उपयोग करें और परिणाम देखें।
1) उद्धरण में संपत्ति असाइनमेंट को लपेटे बिना।
var Name = @Model.Name;
var Age = @Model.Age;
var LoginTime = @Model.LoginDateTime;
var IsAuthenticated = @Model.IsAuthenticated;
var IconHtml = @Model.UserIconHTML;
जैसा कि आप देख सकते हैं कि कुछ त्रुटियां हैं, Raj
और True
उन्हें जावास्क्रिप्ट चर माना जाता है और चूंकि वे एक variable undefined
त्रुटि मौजूद नहीं हैं । जहाँ तक डेटाइम वेरिएबल के लिए त्रुटि है, unexpected number
संख्याओं में विशेष वर्ण नहीं हो सकते हैं, HTML टैग्स को इसके निकाय नामों में परिवर्तित किया जाता है ताकि ब्राउज़र आपके मूल्यों और HTML मार्कअप को न मिलाए।
2) कोट्स में संपत्ति असाइनमेंट लपेटना।
var Name = '@Model.Name';
var Age = '@Model.Age';
var LoginTime = '@Model.LoginDateTime';
var IsAuthenticated = '@Model.IsAuthenticated';
var IconHtml = '@Model.UserIconHTML';
परिणाम मान्य हैं, इसलिए उद्धरणों में संपत्ति असाइनमेंट को लपेटने से हमें वैध वाक्यविन्यास मिलता है। लेकिन ध्यान दें कि संख्या Age
अब एक स्ट्रिंग है, इसलिए यदि आप नहीं चाहते हैं कि हम केवल उद्धरण हटा सकते हैं और इसे एक नंबर प्रकार के रूप में प्रदान किया जाएगा।
3) का उपयोग करना, @Html.Raw
लेकिन उद्धरण में लपेटे बिना
var Name = @Html.Raw(Model.Name);
var Age = @Html.Raw(Model.Age);
var LoginTime = @Html.Raw(Model.LoginDateTime);
var IsAuthenticated = @Html.Raw(Model.IsAuthenticated);
var IconHtml = @Html.Raw(Model.UserIconHTML);
परिणाम हमारे परीक्षण के मामले के समान हैं। 1. हालांकि स्ट्रिंग @Html.Raw()
पर उपयोग करने से HTML
हमें कुछ बदलाव दिखा। HTML को उसके निकाय नामों में बदले बिना बरकरार रखा गया है।
डॉक्स से Html.Raw ()
HTML मार्कअप को एक HtmlString उदाहरण में लपेटता है ताकि इसे HTML मार्कअप के रूप में समझा जाए।
लेकिन फिर भी हमारे पास अन्य लाइनों में त्रुटियां हैं।
4) का उपयोग करना @Html.Raw
और उद्धरण के भीतर भी लपेटना
var Name ='@Html.Raw(Model.Name)';
var Age = '@Html.Raw(Model.Age)';
var LoginTime = '@Html.Raw(Model.LoginDateTime)';
var IsAuthenticated = '@Html.Raw(Model.IsAuthenticated)';
var IconHtml = '@Html.Raw(Model.UserIconHTML)';
परिणाम सभी प्रकार के साथ अच्छे हैं। लेकिन हमारा HTML
डेटा अब टूट गया है और इससे स्क्रिप्ट टूट जाएगी। मुद्दा यह है क्योंकि हम '
डेटा को लपेटने के लिए सिंगल कोट्स का उपयोग कर रहे हैं और यहां तक कि डेटा के सिंगल कोट्स भी हैं।
हम 2 दृष्टिकोणों के साथ इस मुद्दे को दूर कर सकते हैं।
1) " "
HTML भाग को लपेटने के लिए दोहरे उद्धरण चिह्नों का उपयोग करें । जैसा कि आंतरिक डेटा में केवल एकल उद्धरण हैं। (यह सुनिश्चित करें कि दोहरे उद्धरण चिह्नों के बाद "
भी डेटा के भीतर नहीं हैं)
var IconHtml = "@Html.Raw(Model.UserIconHTML)";
2) अपने सर्वर साइड कोड में वर्ण अर्थ से बच। पसंद
UserIconHTML = "<i class=\"fa fa-users\"></i>"
संपत्ति असाइनमेंट का निष्कर्ष
- गैर-संख्यात्मक डेटाटाइप के लिए उद्धरणों का उपयोग करें।
- संख्यात्मक डेटा टाइप के लिए उद्धरणों का उपयोग न करें।
Html.Raw
अपने HTML डेटा की व्याख्या करने के लिए उपयोग करें ।
- अपने HTML डेटा का ध्यान रखें या तो सर्वर साइड में दिए गए उद्धरणों से बच सकते हैं, या जावास्क्रिप्ट चर के असाइनमेंट के दौरान डेटा की तुलना में एक अलग उद्धरण का उपयोग करें।
वस्तु का काम
असाइनमेंट के लिए विभिन्न सिंटैक्स का उपयोग करें और परिणाम देखें।
1) उद्धरणों में ऑब्जेक्ट असाइनमेंट को लपेटे बिना।
var userObj = @Model;
जब आप जावास्क्रिप्ट चर को एसी # ऑब्जेक्ट असाइन करते .ToString()
हैं तो उस ओजेक्ट का मान असाइन किया जाएगा। इसलिए उपरोक्त परिणाम।
2 कोट्स में रैपिंग ऑब्जेक्ट असाइनमेंट
var userObj = '@Model';
३)Html.Raw
बिना उद्धरण के उपयोग करना ।
var userObj = @Html.Raw(Model);
4)Html.Raw
उद्धरण के साथ उपयोग करना
var userObj = '@Html.Raw(Model)';
Html.Raw
हमारे लिए कोई ज्यादा उपयोग की थी चर करने के लिए एक वस्तु बताए हैं।
5)Json.Encode()
बिना उद्धरण के उपयोग करना
var userObj = @Json.Encode(Model);
//result is like
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482572875150)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
हम कुछ बदलाव देखते हैं, हम देखते हैं कि हमारे मॉडल को एक वस्तु के रूप में व्याख्यायित किया जा रहा है। लेकिन हमारे पास उन विशेष पात्रों को बदल दिया गया है entity names
। इसके अलावा उद्धरण में उपरोक्त वाक्य रचना को लपेटने से कोई फायदा नहीं है। हम बस उद्धरण के भीतर एक ही परिणाम मिलता है।
Json.Encode () के डॉक्स से
एक डेटा ऑब्जेक्ट को एक स्ट्रिंग में जोड़ता है जो जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) प्रारूप में है।
जैसा कि आप पहले से ही entity Name
संपत्ति के असाइनमेंट के साथ इस मुद्दे का सामना कर चुके हैं और यदि आपको याद है कि हम इसके इस्तेमाल से आगे निकल गए हैं Html.Raw
। तो चलो कोशिश करते हैं कि बाहर। चलो गठबंधन Html.Raw
औरJson.Encode
6) का उपयोग करना Html.Raw
और Json.Encode
उद्धरण के बिना।
var userObj = @Html.Raw(Json.Encode(Model));
परिणाम एक मान्य जावास्क्रिप्ट ऑब्जेक्ट है
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482573224421)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
7) उद्धरणों का उपयोग करना Html.Raw
और Json.Encode
भीतर।
var userObj = '@Html.Raw(Json.Encode(Model))';
जैसा कि आप उद्धरण के साथ लपेटते हुए देखते हैं, हमें JSON डेटा देता है
ऑब्जेक्ट असाइनमेंट पर शामिल होना
- का प्रयोग करें
Html.Raw
और Json.Encode
combintaion में के रूप में जावास्क्रिप्ट चर करने के लिए अपने वस्तु आवंटित करने के लिए जावास्क्रिप्ट वस्तु ।
- JSON प्राप्त करने के लिए इसका उपयोग करें
Html.Raw
और Json.Encode
इसे भी लपेटेंquotes
नोट: यदि आपने देखा है DataTime डेटा प्रारूप सही नहीं है। ऐसा इसलिए है क्योंकि जैसा कि पहले कहा गया है Converts a data object to a string that is in the JavaScript Object Notation (JSON) format
और JSON में एक date
प्रकार नहीं है । इसे ठीक करने के लिए अन्य विकल्प हैं कि इस प्रकार के हैंडल को javascipt Date () ऑब्जेक्ट का उपयोग करने के लिए कोड की एक और लाइन जोड़ना है
var userObj.LoginDateTime = new Date('@Html.Raw(Model.LoginDateTime)');
//without Json.Encode
.js
फ़ाइल में जावास्क्रिप्ट / जक्वेरी कोड ब्लॉक में मॉडल डेटा का उपयोग कैसे करें
रेजर सिंटैक्स का .js
फ़ाइल में कोई अर्थ नहीं है और इसलिए हम सीधे अपने मॉडल का उपयोग नहीं कर सकते हैं .js
। हालाँकि एक समाधान है।
1) समाधान जावास्क्रिप्ट वैश्विक चर का उपयोग कर रहा है ।
हमें मान को एक वैश्विक स्कॉप्ड javascipt वैरिएबल पर असाइन करना होगा और फिर इस वेरिएबल का उपयोग अपनी .cshtml
और .js
फाइलों के सभी कोड ब्लॉक के भीतर करना होगा । तो वाक्य रचना होगी
<script type="text/javascript">
var userObj = @Html.Raw(Json.Encode(Model)); //For javascript object
var userJsonObj = '@Html.Raw(Json.Encode(Model))'; //For json data
</script>
इस स्थान में हम चर का उपयोग कर सकते हैं userObj
और userJsonObj
जब कभी जरूरत है।
नोट: मैं व्यक्तिगत रूप से वैश्विक चर का उपयोग करने का सुझाव नहीं देता क्योंकि यह रखरखाव के लिए बहुत कठिन हो जाता है। हालाँकि यदि आपके पास कोई अन्य विकल्प नहीं है तो आप इसे उचित नामकरण सम्मेलन के साथ उपयोग कर सकते हैं .. कुछ ऐसा userAppDetails_global
।
2) फ़ंक्शन का उपयोग करना () या closure
किसी फ़ंक्शन में मॉडल डेटा पर निर्भर सभी कोड को लपेटें। और फिर .cshtml
फ़ाइल से इस फ़ंक्शन को निष्पादित करें ।
external.js
function userDataDependent(userObj){
//.... related code
}
.cshtml
फ़ाइल
<script type="text/javascript">
userDataDependent(@Html.Raw(Json.Encode(Model))); //execute the function
</script>
नोट: आपकी बाहरी फ़ाइल को उपरोक्त स्क्रिप्ट से पहले संदर्भित किया जाना चाहिए। इसके अलावा userDataDependent
फ़ंक्शन अपरिभाषित है।
यह भी ध्यान दें कि फ़ंक्शन वैश्विक दायरे में भी होना चाहिए। इसलिए या तो समाधान के लिए हमें वैश्विक स्तर के खिलाड़ियों से निपटना होगा।