2013-12-17 5 views
0

Я немного поработал и попробовал несколько решений из разных сообщений, но не могу заставить их работать. Основная идея заключается в следующем: я настраиваю существующий usercontrol, который выводит динамически генерируемые данные в одну таблицу столбцов строк. Затем он имеет ссылку «edit», которая выполняет обратную передачу и восстанавливает таблицу с редактируемыми полями. Я нашел некоторый jQuery, который я использую, чтобы преобразовать таблицу в таблицу из 2 строк, разбитую на несколько столбцов (намного проще, чем пытаться перестроить создание/разметку данных в C#). Когда страница загружается в первый раз, она работает отлично. Однако, когда я нажимаю кнопку «edit», он корректно выполняет обратную передачу, но jQuery не запускается. Я попробовал несколько конфигураций безрезультатно. Вот JQuery:Невозможно запустить jQuery для отправки по почте

private void RegisterScripts() 
{ 
    StringBuilder sbScript = new StringBuilder(); 
    sbScript.Append("\tvar tables = $('table[id*=\"tblAttribute\"]');\n"); 
    sbScript.Append("\tfor (var i = 0; i < tables.length; i++) {\n"); 
    sbScript.Append("\t\tvar newTable = document.createElement('table');\n"); 
    sbScript.Append("\t\tvar columns = 2;\n"); 
    sbScript.Append("\t\tfor(var c = 0; c < columns; c++) {\n"); 
    sbScript.Append("\t\t\tnewTable.insertRow(c);\n"); 
    sbScript.Append("\t\t\tfor(var r = 1; r < tables[i].rows.length ; r++) {\n"); 
    sbScript.Append("\t\t\t\tnewTable.rows[c].insertCell(r-1);\n"); 
    sbScript.Append("\t\t\t\tnewTable.rows[c].cells[r-1].innerHTML = tables[i].rows[r].cells[c].innerHTML;\n"); 
    sbScript.Append("\t\t\t\tnewTable.rows[c].cells[r-1].className = tables[i].rows[r].cells[c].className;\n"); 
    sbScript.Append("\t\t\t\ttables[i].rows[r].style.display = 'none';\n"); 
    sbScript.Append("\t\t\t}\n"); 
    sbScript.Append("\t\t}\n"); 
    sbScript.Append("\t\tnewTable.className = tables[i].className;\n"); 
    sbScript.Append("\t\ttables[i].parentNode.appendChild(newTable);\n"); 
    sbScript.Append("\t}\n"); 

    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "RowsToColumnsScript", sbScript.ToString(), true); 

} 

Вот вызов в цикле Page_Load:

protected void Page_Load(object sender, EventArgs e) 
{ 
    RegisterScripts(); 
    // Other Stuff // 
} 

Я также попытался замены RegisterClientScriptBlock() с RegisterStartupScript() и получили те же результаты. Что мне не хватает?

EDIT 2: Вот сценарий, который добавляется на страницу клиента. Я скопировал прямо из исходного кода страницы (минус моей аббревиатуры):

<script type="text/javascript"> 
//<![CDATA[ 
var tables = $('table[id*="tblAttribute"]'); 
for (var i = 0; i < tables.length; i++) { 
    var newTable = document.createElement('table'); 
    var columns = 2; 
    for(var c = 0; c < columns; c++) { 
     newTable.insertRow(c); 
     for(var r = 1; r < tables[i].rows.length ; r++) { 
      newTable.rows[c].insertCell(r-1); 
      newTable.rows[c].cells[r-1].innerHTML = tables[i].rows[r].cells[c].innerHTML; 
      newTable.rows[c].cells[r-1].className = tables[i].rows[r].cells[c].className; 
      tables[i].rows[r].style.display = 'none'; 
     } 
    } 
    newTable.className = tables[i].className; 
    tables[i].parentNode.appendChild(newTable); 
} 
// Other js registered from other usercontrols 
</script> 
+1

Вы используете «UpdatePanel» или нет? –

+1

Вы можете разместить инструкцию оповещения или отладчика, чтобы убедиться, что код выполнен или нет. –

+0

@KarlAnderson - Нет, я не использую панель обновления. – gmaness

ответ

0

Во-первых, почему бы вам не сделать что-то это ...

string script = @"var tables = $('table[id*=\'tblAttribute\']'); 
    for (var i = 0; i < tables.length; i++) { 
    //rest of your script 
"; 

Это сделает ваш сценарий гораздо проще читать и вносить изменения. Белое пространство будет уважаться. Поэтому вам не нужны символы \ n и \ t.

После этого просмотрите полученный HTML-код в своем браузере и убедитесь, что он правильно его разместил. Используйте инструменты отладки вашего браузера, чтобы выполнить сценарий и посмотреть, не возникли ли ошибки.

Или просто вставьте скрипт на странице .aspx вместо добавления его из кода.

+0

Работает jQuery. Это не проблема устранения неполадок jQuery, так как она работает правильно при начальной загрузке страницы. Это проблема, связанная с попыткой заставить его снова выполнить на PostBack. – gmaness

0

Ваш javascript ожидает, что ваши таблицы будут иметь идентификатор, содержащий (*=) строку tblAttribute. Похоже, что javascript, который создает новую редактируемую таблицу, не добавляет к ней атрибут id. Таким образом, в то время как ваш код-код регистрирует скрипт и выполняется при каждом обратном вызове, вы не видите его, потому что ваша вновь редактируемая таблица не соответствует критериям $('table[id*="tblAttribute"]').

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

newTable.setAttribute("id", "tblAttribute" + i); 

Очевидно, что id должен быть уникальным, чтобы просто добавить свой итератор tblAttribute может создавать конфликты, но это должно заставить вас в правильном направлении.

EDIT

Видя обновленный комментарий, относящийся к UpdatePanel, вы могли бы найти этот ответ полезным: Registering scripts with an UpdatePanel

+0

замечательная мысль, однако в этом конкретном случае, когда происходит обратная передача, совершенно другая таблица отображается кодом, который по-прежнему соответствует критериям «tblAttribute». Я проверил это с помощью элемента проверки на странице после обратной передачи. Именно поэтому я использую «id * =», чтобы удостовериться, что он выбирает как таблицу перед отправкой, так и таблицу после обратной передачи. – gmaness

+1

@gmaness Я добавил редактирование, которое может помочь – ethorn10

1

попробовать оборачивать ваши коды Jquery внутри готовой функции

$(function(){ 
    // place your code here 
}); 

.

<script type="text/javascript"> 
$(function(){ 
    //<![CDATA[ 
    var tables = $('table[id*="tblAttribute"]'); 
    for (var i = 0; i < tables.length; i++) { 
    var newTable = document.createElement('table'); 
    var columns = 2; 
    for(var c = 0; c < columns; c++) { 
     newTable.insertRow(c); 
     for(var r = 1; r < tables[i].rows.length ; r++) { 
      newTable.rows[c].insertCell(r-1); 
      newTable.rows[c].cells[r-1].innerHTML = tables[i].rows[r].cells[c].innerHTML; 
      newTable.rows[c].cells[r-1].className = tables[i].rows[r].cells[c].className; 
      tables[i].rows[r].style.display = 'none'; 
     } 
    } 
    newTable.className = tables[i].className; 
    tables[i].parentNode.appendChild(newTable); 
    } 
    // Other js registered from other usercontrols 
}); 
</script> 
Смежные вопросы