Переменная область на странице aspx - PullRequest
13 голосов
/ 26 марта 2012

Почему переменная scriptPath находится в области действия вне области действия в нижней части кода?

Разве она не должна находиться в области видимости на этой странице?В MVC, если я отмечу это в верхней части страницы как

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

, оно будет доступно во всем текущем представлении.Чего мне не хватает сейчас, когда я ненадолго вернулся в WebForms?

enter image description here

Если я изменю позицию кода, получится страннее, чем внутри <head> Я больше неу меня есть доступ к переменной, но у меня есть, внутри <body> сейчас ...: - /

enter image description here

Ответы [ 3 ]

13 голосов
/ 08 июня 2012

Когда вы объявляете переменную в файле .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;

Затем вы можете использовать эти переменные в любом месте кода веб-форм.

4 голосов
/ 15 октября 2014

Вы также можете объявить свои константы следующим образом:

<script runat="server">
    private const string scriptPath = "assets/scripts/";
    private const string gkoConfig = "GkoConfig.js";
</script>
0 голосов
/ 30 марта 2012

Я подозреваю, что заголовок страницы ASPX обрабатывается отдельно от тела.

Эта проблема легко решается - все, что вам нужно сделать, это использовать поле класса в коде с выделенным уровнем доступа.

...