Получение идентификатора встроенного ASP-объекта с использованием JavaScript и jQuery - PullRequest
1 голос
/ 07 ноября 2008

Я использую jQuery, чтобы попытаться вызвать метод, когда jQuery обрабатывает событие изменения выпадающего списка ASP.NET (2.0). Проблема в том, что выпадающий список находится внутри вида сетки и даже тогда, только когда пользователь решил редактировать строку в этом виде сетки.

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

$(document).ready(function() //when DOM is ready, run containing code
{
    <% if (grvTimeSheets.EditIndex > -1) {%>
        $(#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>).change(function() {
             $(#<%= grvTimeSheets.ClientID %>).block({ message: null }
        });
}
);
<% } %>

Это была одна попытка, которую я сделал, и я также попытался поместить ASP-код оператора IF вне блока JavaScript. Это тоже не работает.

Как я могу применить событие jQuery к выпадающему списку? Идеально максимально кратко.


Спасибо за ответ, но нет, он не работает :(. Кажется, код JavaScript не выводится ... Смущает ...

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //When DOM is ready, run the containing code
    {

    }
    );
</script>

Это выход. Хотя это код:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //when DOM is ready, run containing code
    {<% if (grvTimeSheets.EditIndex > -1) {%>
        var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
        $(id).change(function() {
             $(id).block({ message: null }
        });
     <% } %>
    }
    );
</script>

Он делал это и раньше, сводя меня с ума.


Извините, не могли бы вы сделать это немного яснее. Я попытался определить все это в коде так:

DropDownList ddl (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    $(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
          csm.RegisterStartupScript(cstype, csname1, script, true);
}

Это то, что вы имели в виду?

Кстати, вышесказанное не сработало. Нет ошибок, просто нет событий.

Ответы [ 9 ]

2 голосов
/ 07 ноября 2008

Несколько вещей здесь.

  1. Вам нужно заключить ваши селекторы в кавычки, когда вы передаете их функции $(). Приведенный выше фрагмент кода генерирует что-то вроде $(#some-generated-id), что не сработает.
  2. Закрывающая фигурная скобка для вашей серверной части, если инструкция находилась вне функции onready. Он должен быть вложен на том же уровне, что и открытие, если.

Попробуйте это:

$(document).ready(function() //when DOM is ready, run containing code
{
  <% if (grvTimeSheets.EditIndex > -1) {%>
      var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
      $(id).change(function() { 
           $(id).block({ message: null }
        }); 
 <% } %>
}
);

Если это не сработает, вставьте также сгенерированный javascript.

1 голос
/ 07 ноября 2008

Если вы не используете тот же идентификатор в другом месте на странице, вы можете помешать Уникальный идентификатор ASP.NET с одним из расширенных селекторов jQuery:

$('[id$=ddlClients]')

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

См. Селекторы для дополнительных примеров.

1 голос
/ 07 ноября 2008

Другой вариант - просто дать элементу, который вы ищете, имя класса, которое описывает его поведение. Тогда ваш код jQuery станет действительно понятным:

$(function() {
    $("select.yourMarkerClass").change(....);
});

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

1 голос
/ 07 ноября 2008

Внутри вашего блока скрипта, который вы создаете в коде:

string script = @"<script type=text/javascript> var myControlId = '" + ddl.ClientId  "';") + "</script>"

Я не проверял этот синтаксис, но он должен быть закрыт. Вы можете добавить дополнительный синтаксис для grvTimeSheets.ClientID самостоятельно. Если это работает, то вы можете изменить его, чтобы построить массив JavaScript и сохранить таким образом ClientId, и тогда у вас будет только одна глобальная переменная JavaScript, с которой вам нужно работать.

1 голос
/ 07 ноября 2008

Используйте это:

cs.RegisterClientScriptBlock(cstype, csname, cstext2.ToString(), False)

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

Кроме того, просто поместите идентификаторы клиента ваших элементов управления в отдельные переменные из кода, а не в код jQuery .

Затем используйте переменные, содержащие идентификаторы, вместо этого в коде jQuery.

1 голос
/ 07 ноября 2008

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

Вот пример моего JavaScript во внешнем файле:

var myFancySelector = '#' + myControlId;
selectedValue = $(myFancySelector).val();

myControlId определяется из кода и зарегистрирован в ClientScriptBlock.

0 голосов
/ 07 ноября 2008

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

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

Извините, я должен был прочитать ваш код ближе.

0 голосов
/ 07 ноября 2008

попробую еще после выходных. Это был код:

DropDownList ddl = (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    jQuery(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
    csm.RegisterStartupScript(cstype, csname1, script, false);
0 голосов
/ 07 ноября 2008

Ключ может быть любым, но уникальным.

...