Когда вы объявляете переменную в файле .aspx Web Forms, вы фактически объявляете локальную переменную в автоматически сгенерированном методе рендеринга. ASP.NET генерирует отдельные методы рендеринга для всех тегов, помеченных runat="server"
, поэтому вы фактически получаете отдельный метод для вашего элемента head. Теперь объявленная вами переменная может существовать только в одном из этих методов - отсюда и «странное» поведение.
Вы можете увидеть, как это работает, если вы предварительно скомпилируете свое приложение, используя aspnet_compiler.exe. Вы получите скомпилированные файлы DLL для каждой страницы веб-форм; просто откройте один из них в Reflector, чтобы увидеть сгенерированный код. Я написал минимальный эквивалент вашего кода с переменной, объявленной вне тега head, и вот метод визуализации верхнего уровня, который я получил:
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"
с вашей метки головы; однако я бы порекомендовал вам объявить защищенную переменную в вашем классе code-behind. Добавление такой строки в файл с выделенным кодом будет работать:
protected string scriptPath, gkoConfig;
Затем вы можете использовать эти переменные в любом месте кода веб-форм.