2012-03-26 108 views
13

爲什麼scriptPath變量是超出範圍在代碼的底部?aspx頁面中的變量範圍

是不是整個頁面範圍內?在MVC,如果我上標出像

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

它可在整個當前查看頁面的頂部。現在我又回到WebForms一段時間了,我在想什麼?

enter image description here

如果我更改代碼位置,它得到的怪異作爲<head>裏面我不再有機會獲得格蘭變量,但我有,在裏面<body>現在...: -/

enter image description here

回答

13

當您在Web Forms .aspx文件中聲明變量時,實際上是在自動生成的呈現方法中聲明瞭局部變量。 ASP.NET爲所有標記爲runat="server"的標記生成單獨的呈現方法,因此您實際上爲頭元素獲取了單獨的方法。現在,你聲明的變量只能存在於這些方法之一中 - 因此是'怪異'的行爲。

你可以看到這是如何工作的,如果你pre-compile your application using aspnet_compiler.exe.你會得到每個網頁表單的編譯DLL文件;只需在Reflector中打開其中一個即可查看生成的代碼。我寫你的代碼的最小當量與頭標記之外聲明的變量,這裏是頂級渲染方法,我得到:

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; 

然後,您可以在您的Web窗體代碼的任何地方使用這些變量。

+0

當你說「代碼隱藏類」,你是什麼意思(比如,像一個的Index.aspx頁)? – serhio 2014-04-18 07:27:40

+0

代碼隱藏類是在.cs文件中爲頁面聲明的類,例如index.aspx.cs for index.aspx。 – 2014-04-19 01:47:09

+0

好的,理解。我開始直接學習MVC,沒有「經典」ASP經驗,這就是爲什麼我最初不明白。謝謝! – serhio 2014-04-23 12:39:59

0

我懷疑ASPX頁面的頭部是從身體分開處理的。

此問題很容易解決 - 您只需在代碼隱藏中將訪問級別設置爲受保護的類字段。

3

您也可以宣佈你的常量是這樣的:

<script runat="server"> 
    private const string scriptPath = "assets/scripts/"; 
    private const string gkoConfig = "GkoConfig.js"; 
</script>