Как проверить, регистрируется ли клиентский сценарий уже во время частичной обратной передачи

Ниже код, который я в настоящее время реализовывал.

if (!Page.ClientScript.IsStartupScriptRegistered(Page.GetType(), scriptKey))
{
  ScriptManager scriptManager = ScriptManager.GetCurrent(page);
  if (scriptManager != null && scriptManager.IsInAsyncPostBack)
  {
    //if a MS AJAX request, use the Scriptmanager class
    ScriptManager.RegisterStartupScript(Page, Page.GetType(), scriptKey, script, true);
  }
  else
  {
    //if a standard postback, use the standard ClientScript method
    Page.ClientScript.RegisterStartupScript(Page.GetType(), scriptKey, script, true);
  }
}

Я делаю, как предложено в этом ответе так, чтобы я мог зарегистрировать сценарий запуска на обоих разах т.е. когда существует частичная обратная передача и полная обратная передача.

Проблема Page.ClientScript.IsStartupScriptRegistered(Page.GetType(), scriptKey) всегда (даже когда сценарий регистрируется прежде) возвращает false, когда это - частичная обратная передача. И я не мог найти ScriptManager. IsStartupScriptRegistered (статический) метод. В результате этого дополнительный сценарий испускается на всех частичных/асинхронных обратных передачах.

Обратите внимание на то, что я использую менеджер скриптов версии 4.1 AjaxControlToolkit т.е. ToolkitScriptManager в моем masterpage. Но я не делаю вещи, она имеет некоторое отношение к этому.

ОБНОВЛЕНИЕ

  
    
      
    
    
      

Заранее спасибо.

Примечание: Чтобы смочь понять достижения по этой проблеме, см. комментарии к этому ответу перед ответом.

ОБНОВЛЕНИЕ
Я реализовал временное решение этой проблемы путем помещения регистрации JavaScript, которые, если сценарий уже выполняется затем, не выполняются дважды. JavaScript все еще досаждают многократно на каждой частичной обратной передаче. Не мог предотвратить его.

Когда представления к этому сообщению увеличиваются, я вижу, что существуют другие люди, которые могли бы также хотеть решение этой проблемы.

13
задан Community 23 May 2017 в 12:13
поделиться

3 ответа

Возможно, вы имели в виду следующее: ClientScriptManager.IsStartupScriptRegistered Method

0
ответ дан 1 December 2019 в 23:14
поделиться

Имейте в виду, что ваша первая строка кода является обратной по отношению к возвращаемому значению метода из-за ! .

if (!Page.ClientScript.IsStartupScriptRegistered(Page.GetType(), scriptKey))

Если IsStartupScriptRegistered возвращает false, как вы говорите, то оператор if должен оценивать true из-за ! . Это должно привести к тому, что скрипт будет зарегистрирован, как и ожидалось.

Ваш код основан на моем ответе здесь, который был основан на ASP.NET AJAX 1.0 и ASP.NET 2.0. Возможно, это как-то связано с .NET 3.5, хотя я полагаю, что уже использовал вышеприведенный код в более новом проекте, который мы делали под 3.5, и он работал нормально...

Можете ли вы выложить какую-нибудь разметку вместе с кодом?

EDIT: Спасибо, что выложили разметку.

Теперь я заметил 2 вещи:

Вы упомянули, что используете ToolkitScriptManager. Это элемент управления, который наследуется от ScriptManager. Я не заметил этого раньше, но ваш код по-прежнему ссылается на ScriptManager напрямую. Вы сказали, что скрипт не работает именно во время асинхронных постбеков, что наводит меня на мысль, что это проблема с вашей ссылкой на ScriptManager. Я никогда раньше не использовал ToolkitScriptManager, поэтому не могу дать вам точный код, но могу сказать, что вам, скорее всего, придется обновить ваш code-behind, изменив все ссылки на ScriptManager и его методы/свойства на эквивалентные в ToolkitScriptManager.

Попробуйте добавить точку останова на оператор if и убедитесь, что его оценка равна true. Я не удивлюсь, если scriptManager будет null, или scriptManager.IsInAsyncPostBack будет false, потому что вы используете ToolkitScriptManager.

ScriptManager scriptManager = ScriptManager.GetCurrent(page);
if (scriptManager != null && scriptManager.IsInAsyncPostBack)
{
  //if a MS AJAX request, use the Scriptmanager class
  ScriptManager.RegisterStartupScript(Page, Page.GetType(), scriptKey, script, true);
}

И последнее - Ваша разметка выглядит нормально, за исключением того, что вам не нужен раздел <Триггеры>. Триггеры позволяют указать элементы управления, которые находятся вне панели обновления, чтобы вызвать частичный рендеринг. Любой дочерний элемент управления панели обновления в разделе будет делать это автоматически. Кнопка, на которую вы нацеливаетесь в разделе "Триггеры", уже находится внутри панели обновления. Хотя я не думаю, что это причина вашей проблемы, я бы удалил ее в любом случае.

Надеюсь, это поможет.

1
ответ дан 1 December 2019 в 23:14
поделиться

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

2
ответ дан 1 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

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