2012-03-26 18 views
13

क्यों scriptPath वैरिएबल कोड के नीचे से बाहर है?एएसपीएक्स पृष्ठ में परिवर्तनीय दायरा

क्या यह इस पृष्ठ में दायरे में नहीं होना चाहिए? एमवीसी में, यदि मैं इसे पृष्ठ के शीर्ष पर

@{ 
    string scriptPath = "assets/scripts/", 
      gkoConfig = "GkoConfig.js"; 
} 

यह वर्तमान दृश्य में उपलब्ध है। अब मुझे क्या याद आ रहा है कि मैं थोड़ी देर के लिए वेबफॉर्म पर वापस आ गया हूं?

enter image description here

अगर मैं कोड स्थिति को बदलने, यह <head> अंदर के रूप में मैं अब तेह चर के लिए उपयोग किया है weirder मिलता है, लेकिन मैं अब ... है, <body> अंदर: -/

enter image description here

उत्तर

13

जब आप किसी वेब प्रपत्र .aspx फ़ाइल में एक चर घोषित करते हैं, तो आप वास्तव में एक ऑटो-जेनरेटेड प्रतिपादन विधि के अंदर एक स्थानीय चर घोषित कर रहे हैं। एएसपी.नेट runat="server" चिह्नित सभी टैग के लिए अलग प्रतिपादन विधियों को उत्पन्न करता है, इसलिए आपको वास्तव में आपके मुख्य तत्व के लिए एक अलग विधि मिलती है। अब, आपके द्वारा घोषित वेरिएबल केवल इन विधियों में से एक में मौजूद हो सकता है - इसलिए 'अजीब' व्यवहार।

आप देख सकते हैं कि यह कैसे काम करता है यदि आप pre-compile your application using aspnet_compiler.exe. आपको अपने प्रत्येक वेब फ़ॉर्म पृष्ठों के लिए डीएलएल फाइल संकलित करेंगे; जेनरेट कोड देखने के लिए केवल उन लोगों में से एक को प्रतिबिंबित करें। मैं चर हेड टैग के बाहर घोषित के साथ अपने कोड का एक न्यूनतम बराबर लिखा था, और यहां उच्च-स्तरीय विधि है कि मुझे मिल गया प्रस्तुत करना है:

private void __Render__control1(HtmlTextWriter __w, Control parameterContainer) 
{ 
    string str = "scripts/"; 
    __w.Write("\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n"); 
    parameterContainer.Controls[0].RenderControl(__w); 
    __w.Write("\r\n<body>\r\n "); 
    parameterContainer.Controls[1].RenderControl(__w); 
    __w.Write("\r\n <script type=\"text/javascript\" src=\""); 
    __w.Write(str); 
    __w.Write("jquery-1.4.1.min.js\"></script>\r\n</body>\r\n</html>\r\n"); 
} 

आप देखते हैं कि चर है कि मैं घोषित (यहाँ str नाम) है इस विधि के लिए स्कॉप्ड किया गया है, और यह सिर को प्रस्तुत करने के लिए अन्य विधियों को कॉल कर रहा है (और एक फॉर्म तत्व runat="server" चिह्नित किया गया है।)

आपके सिर टैग से runat="server" को निकालने के लिए एक त्वरित और गंदा समाधान हो सकता है; हालांकि, मैं अनुशंसा करता हूं कि आप इसके लिए अपने कोड-बैक क्लास में एक संरक्षित चर घोषित करें। अपने कोड-पीछे फाइल करने के लिए इस तरह की एक पंक्ति जोड़ना काम करेगा:

protected string scriptPath, gkoConfig; 

तब आप अपने वेब प्रपत्र कोड में कहीं भी इन चर का उपयोग कर सकते हैं।

+0

जब आप कहते हैं कि "कोड-पीछे वर्ग", तुम्हारा क्या मतलब है (जैसे कि, index.aspx की तरह एक पेज के लिए)? – serhio

+0

कोड-बैक क्लास पृष्ठ के लिए .cs फ़ाइल में घोषित कक्षा है, उदाहरण के लिए, index.aspx.cs index.aspx के लिए। –

+0

ठीक है, समझा। मैंने एमवीसी को सीधे "क्लासिक" एएसपी अनुभव रखने के बारे में सीखना शुरू किया, इसीलिए मुझे शुरुआत में समझ में नहीं आया .. धन्यवाद! – serhio

0

मुझे संदेह है कि एएसपीएक्स पेज के सिर को शरीर से अलग से संसाधित किया जाता है।

यह समस्या आसानी से सुलझाई जा सकती है - आपको बस इतना करना है कि कोड स्तर पर क्लास फ़ील्ड का उपयोग सुरक्षित स्तर पर सुरक्षित स्तर पर सेट किया गया हो।

3

आप भी इस तरह अपने स्थिरांक की घोषणा कर सकता है:

<script runat="server"> 
    private const string scriptPath = "assets/scripts/"; 
    private const string gkoConfig = "GkoConfig.js"; 
</script> 
संबंधित मुद्दे