Подтвердить что ты не робот

Область переменной на странице aspx

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

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

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

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

enter image description here

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

enter image description here

4b9b3361

Ответ 1

Когда вы объявляете переменную в файле .aspx Web Forms, вы фактически объявляете локальную переменную внутри метода автогенерации рендеринга. ASP.NET генерирует отдельные методы рендеринга для всех тегов с меткой runat="server", поэтому вы фактически получаете отдельный метод для вашего элемента head. Теперь переменная, которую вы объявляете, может существовать только в одном из этих методов - отсюда "странное" поведение.

Вы можете увидеть, как это работает, если вы предварительно скомпилируете свое приложение с помощью 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 Forms.

Ответ 2

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

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

Ответ 3

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

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