ASP.NET - JavaScript в AJAX UpdatePanel

Я сталкиваюсь с проблемой с под управлением JavaScript из внешнего файла JavaScript в UpdatePanel. Я пытаюсь получить палитру цветов, работающую в ListView. ListView в UpdatePanel.

Я использую эту палитру цветов.

Вот то, к чему я сузил его:

  • Если я использую палитру цветов на текстовом поле за пределами UpdatePanel, это работает превосходное посредством всех обратных передач.

  • Если я использую палитру цветов на текстовом поле в UpdatePanel, это работает, пока я не делаю асинхронную обратную передачу (нажимающий на кнопку "EDIT" в ListView). Однажды UpdatePanel сделал обратную передачу, текстовое поле больше не будет показывать палитру цветов при нажатии. То же происходит, когда текстовое поле находится в любом InsertItemTemplate или EditItemTemplate из ListView.

Если требуется копировать его, просто загрузите палитру цветов (это свободно), то добавьте это к веб-странице...




Когда страница загружается, палитра цветов хорошо работает. При нажатии на кнопку (который делает обратную передачу), палитра цветов больше не будет работать.

Какие-либо идеи?

10
задан Charles 16 January 2012 в 04:04
поделиться

4 ответа

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

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

private void RegisterClientStartupScript(string scriptKey, string scriptText)
{
    ScriptManager sManager = ScriptManager.GetCurrent(this.Page);

    if (sManager != null && sManager.IsInAsyncPostBack)
    {
        //if a MS AJAX request, use the Scriptmanager class
        ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), scriptKey, scriptText, true);
    }
    else
    {
        //if a standard postback, use the standard ClientScript method
        scriptText = string.Concat("Sys.Application.add_load(function(){", scriptText, "});");
        this.Page.ClientScript.RegisterStartupScript(this.Page.GetType(), scriptKey, scriptText, true);
    }
}

Я фактически встроил вышеупомянутое в класс базовой страницы, чтобы любая страница, с которой я работаю, могла вызывать this.RegisterClientStartupScript (...) . Для этого просто создайте класс базовой страницы и включите его туда (отметив, что защищенная не является частной, иначе ваши наследующие классы страницы не смогут получить к ней доступ).

С помощью приведенного выше кода, Я могу уверенно регистрировать клиентские скрипты независимо от того, выполняет ли страница обратный вызов или обратный вызов. Понимая, что вы используете внешние файлы сценариев, вы, вероятно, могли бы изменить вышеуказанный метод для регистрации внешних сценариев, а не встроенных. Для получения дополнительных сведений обратитесь к классу ScriptManager , поскольку существует несколько методов регистрации сценариев ...

15
ответ дан 3 December 2019 в 20:42
поделиться

Посмотрев исходный код jscolor, я заметил, что он инициализирует все при загрузке окна. Итак, вам, вероятно, потребуется повторно инициализировать что-то вроде этого (внутри UpdatePanel):

function yourInit(){
   /* keep in mind that the jscolor.js file has no way to determine
      that the script has already been initialized, and you may end
      up initializing it twice, unless you remove jscolor.install();
   */

   if (typeof(jscolor) !== 'undefined'){
      jscolor.init();
   }
}
if (typeof(Sys) !== 'undefined'){
   Sys.UI.DomEvent.addHandler(window, "load", yourInit);
}
else{
   // no ASP.NET AJAX, use your favorite event
   // attachment method here
}

Если вы решите поместить скрипт jscolor внутри UpdatePanel, вам также нужно будет добавить что-то подобное в конец jscolor .js:

if(Sys && Sys.Application){
   Sys.Application.notifyScriptLoaded();
}
2
ответ дан 3 December 2019 в 20:42
поделиться

Вы пробовали ScriptManager.RegisterStartupScript, который позволяет вам «добавлять JavaScript с сервера на страницу при выполнении асинхронной обратной передачи»?

1
ответ дан 3 December 2019 в 20:42
поделиться

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

0
ответ дан 3 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

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