Альтернатива Page_Load в ASP.NET (и хорошая история WTF)

Добейтесь, у меня есть doozy проблемы (мог бы даже быть один для Ежедневной газеты WTF), и я надеюсь, что существует решение. (Мои извинения за длинное сообщение...)

Я работал над веб-сайтом, который я наследовал приблизительно месяц назад. Одна из первых частей продолжала работать, фиксирует одни из средств управления (по существу динамическая панель вверху) так, чтобы это отобразило дополнительную информацию согласно просьбе моими пользователями. Как часть выполнения этого проекта, я создал файл Site.master так, чтобы я не должен был повторно кодировать панель вверху в каждую страницу. Когда я сначала начал делать это, это по-видимому работало очень хорошо. Все страницы, которые я разработал, выглядели большими и панель, обновленная, как она должна, отображая информацию, как она должна.

Ну, когда я отбросил Site.master (и это управление) в более старые страницы сайта (я конкретно не разработал), я заметил, что это выглядело плохо на некоторых из них, но не всех их. Когда я говорю, что это выглядело плохо, в основном, управление будет само выравнивание по левому краю к странице, а не центрироваться, как это должно. Я потратил пару часов, отладив напрасно - CSS выглядел корректным, HTML, казалось, был хорошо, я ничего не видел в JavaScript (хотя, я действительно пропускал что-то, как я укажу через секунду), и даже старый код выглядел корректным (к лучшему, что это могло - это очень хорошо не писаться). Другой коллега смотрел на сайт и ничего не мог найти сначала, также.

Только когда я просто думал для рассмотрения представленного исходного кода страницы (я работал в представлении разработчика до этой точки в IE8), что стало ясно, что было неправильным.

Исходный разработчик выполняет поиски на многих страницах. Для выполнения этого он запрашивает базу данных для ВСЕХ данных и затем загружает их в массивы JavaScript в странице, таким образом, он может получить доступ к ним. Это сам по себе - огромная проблема, потому что мы говорим приблизительно тысячи объектов, и это, очевидно, не масштабируемо (и, да, сайт является медленным). Однако это наконец нажало то, что завинчивало Site.master - когда он загружает данные в массивы JavaScript, он выписывает данные к HTML на Page_Load с помощью многочисленного Ответа. Запишите (представляют вызовы в виде строки). WTF (и что портило меня) - то, что он вставляет JavaScript перед DOCTYPE то, чтобы заставлять IE войти в режим причуд!

Так, потому что я должен, по крайней мере, вывести этот выпуск (я решу настоящую проблему позже), я задавался вопросом: существует ли способ, которым я могу вынудить этот JavaScript быть вставленным в другом месте в HTML — после DOCTYPE по крайней мере? Прямо сейчас, весь Ответ. Запишите (), вызовы делаются в методе Page_Load. Мне просто нужны они, чтобы быть вставленным позже.

5
задан JasCav 31 May 2010 в 02:29
поделиться

3 ответа

Есть несколько способов сделать это, более чем вероятно "правильный" способ сделать это - построить строку, а затем использовать Page.ClientScript.RegisterClientScriptBlock для регистрации JS, это поместит его в нужное место

Другой альтернативой, более быстрым и грязным способом было бы добавить элемент управления на страницу, и вместо response.write создайте JS, а затем установите свойство text литерального элемента управления.

5
ответ дан 14 December 2019 в 13:33
поделиться

Самым простым способом заменить вызовы Response.Write, вероятно, было бы использование StringBuilder:

StringBuilder sb = new StringBuilder();
sb.Append("your script writes here"); // instead of Response.Write

И использование диспетчера Page.ClientScript для размещения скрипта там, где его можно было бы использовать. Существует несколько методов регистрации сценария, и каждый из них размещает сценарий в разных местах на странице, в зависимости от жизненного цикла текущего элемента управления, в который вы находитесь. Вот один пример (уже рассмотренный выше):

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "yourScriptKey", sb.ToString());
1
ответ дан 14 December 2019 в 13:33
поделиться

Поместите сгенерированный код JavaScript в свойство на главной странице, и главная страница обработает его. Главная страница отображает после страниц, которые она инкапсулирует, но ее члены доступны для ее страниц содержимого.

0
ответ дан 14 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: