Как мне зарегистрировать фрагмент сценария, только один раз, с учетом многочисленных последующих асинхронных обратных передач? Пожалуйста, читайте дальше - PullRequest
0 голосов
/ 18 февраля 2011

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

  if (!ScriptManager.GetCurrent(Page).GetRegisteredClientScriptBlocks().Any(x=> x.Key ==   jscriptKey))
        {
          //  Page.RegisterClientScriptBlock(jscriptKey, "");
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), jscriptKey, sb.ToString(), true);
        }

1 Ответ

1 голос
/ 18 февраля 2011

Регистрация блоков клиентских скриптов не сохраняется в ScriptManager через какой-либо скрытый механизм.То есть, если вы посмотрите на GetRegisteredClientScriptBlocks(), то всегда будет пустым после обратной передачи (асинхронной или другой).Однако, хотя ClientScriptManager может не знать о том, что сценарий уже был добавлен в неасинхронно обновляемую часть страницы, все, что было добавлено, будет, конечно же, после асинхронной обратной передачи.Вам нужно каким-то образом отслеживать свои регистрации в своем коде и использовать логику, чтобы зарегистрировать их только один раз.

Какова ваша ситуация?У вас есть пользовательский контроль или что-то, что должно зарегистрировать скрипт?Вы можете либо проверить Page.IsPostBack, и зарегистрироваться, только если это не обратная передача, или если это недостаточно хорошо (потому что элемент управления может быть загружен в первый раз при обратной передаче), а затем установить флаг в ViewState, чтобы он знал, когда он ужезарегистрировал свой скрипт.

...