當您在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窗體代碼的任何地方使用這些變量。
當你說「代碼隱藏類」,你是什麼意思(比如,像一個的Index.aspx頁)? – serhio 2014-04-18 07:27:40
代碼隱藏類是在.cs文件中爲頁面聲明的類,例如index.aspx.cs for index.aspx。 – 2014-04-19 01:47:09
好的,理解。我開始直接學習MVC,沒有「經典」ASP經驗,這就是爲什麼我最初不明白。謝謝! – serhio 2014-04-23 12:39:59