Scriptmanager удалить javascript

Элемент управления ASP.NET ScriptManager автоматически вставляет все виды встроенного javascript, например инициализацию PageRequest. Можно ли удалить или переместить это во внешний файл js?

Так же менеджер скриптов всегда добавляет __DoPostback даже когда не используется на странице, как этого можно избежать или тоже перенести во внешний файл?


person Community    schedule 30.09.2009    source источник
comment
FWIW Я создал приложения, в которых отсутствовали __doPostBack__EVENTARTGET и __EVENTARGUMENT скрытые поля формы)! Вот пример того, как это может произойти: forums.asp.net/p/335942/335994 .aspx   -  person Crescent Fresh    schedule 30.09.2009


Ответы (1)


Прежде всего, "__DoPostBack" вставляется элементами управления, которые могут вызвать обратную передачу, например DropDownList, для свойства AutoPostBack которого задано значение true. Поскольку ScriptManager в основном перехватывает традиционные обратные передачи, я считаю, что это причина для вставки функции.

-- Далее я просто думаю... :)

Теперь о перемещении всего во внешний файл. Это непросто, но «может быть» возможно. Проблема в том, что ASP.NET генерирует сценарии во время выполнения, поэтому вы ничего не можете с этим поделать статически. Что вам нужно учитывать, так это то, почему вы хотели бы сделать это в первую очередь. Дело в том, что большая часть генерируемого скрипта является динамической, что затрудняет его кеширование. Но если вам действительно нужно, вам следует взглянуть на HttpHandlers и HttpModules.

По сути, вам нужно каким-то образом извлечь каждый тег script (без набора атрибутов src). Это можно сделать в HttpModule в событии BeginRequest HttpContext. Теперь вам нужно извлечь всю необходимую информацию и заменить ее ссылкой на конкретный HttpHandler, который может служить заменой. Но чтобы вообще что-то изменилось, вам необходимо выполнить какое-то кэширование существующего скрипта. Вероятно, вы могли бы использовать для этого кэш ASP.NET. Сложность заключается в том, чтобы сравнить существующую запись кэша с новой и определить, следует ли получать кэшированную версию (указывая HttpHandler на существующую запись) или создавать новую запись. Если у вас много скриптов, скорее всего, это будет довольно дорогая операция. Кроме того, вам необходимо определить, может ли клиент кэшировать самостоятельно (электронные теги и т. д. могут пригодиться). Важно, чтобы клиент каждый раз избегал загрузки одних и тех же ненужных скриптов (думаю, это ваша конечная цель?).

Итак, резюмируя:

  • Создайте HttpModule, чтобы позаботиться о перезаписи страницы и помещении извлеченного скрипта в какой-то кеш (например, кеш ASP.NET).
  • Создайте HttpHandler, чтобы он указывал на извлеченный скрипт (он должен передавать содержимое из кеша). Обработчик должен быть помещен вместо извлеченных встроенных скриптов.
  • Создайте какой-нибудь алгоритм для определения недействительности кеша. Я не знаю, что за сценарий может меняться между запросами.

Кстати. Экстернализация скрипта в лучшем случае сложна, поэтому вам нужно быть осторожным, чтобы не внести ошибки, которые невозможно исправить;)

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

person Siewers    schedule 09.10.2009