Obtendo o ID de um objeto ASP incorporado usando JavaScript e jQuery
-
07-07-2019 - |
Pergunta
Eu estou usando jQuery para tentar desencadear um método quando um ASP.NET evento de alteração (2,0) da lista suspensa é tratado pelo jQuery. O problema é que na lista suspensa está localizado dentro de um gridview e mesmo assim somente quando um usuário decidiu editar uma linha dentro desse gridview.
Eu acho que tenho que pegar o objeto usando um bloco de código ASP, mas o problema com isto é que quando a página é carregada pela primeira vez o índice de edição da linha não existe e ele lança um erro. Colocar o bloco dentro de uma instrução IF
também não funciona.
$(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 }
});
}
);
<% } %>
É uma tentativa que eu fiz, e eu também tentei colocar o IF código ASP fora do bloco de JavaScript. Ele não quer trabalhar.
Como eu poderia aplicar o evento jQuery para a caixa de queda a queda? Idealmente o mais conciso possível.
Obrigado pela resposta, mas não, ele não funciona :(. O código JavaScript parece não ser emitido ... Confundindo ...
<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>
é a saída. Mesmo que este é o código:
<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>
Ele estava fazendo isso antes, bem, me deixando louco.
Desculpe, você poderia fazer isso um pouco mais claro. Tentei definir a coisa toda em código por trás assim:
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);
}
É isso que você queria dizer?
BTW, o acima não funcionou. Sem erros, apenas há eventos trabalhou.
Solução
Um par de coisas aqui.
- Você precisa envolver seus seletores entre aspas quando você passá-las para a função
$()
. O trecho de código acima gera algo como$(#some-generated-id)
, que não vai funcionar. - A chave de fechamento para o lado seu servidor se declaração foi fora da função onready. Ele precisa ser aninhados no mesmo nível como a abertura se.
Tente esta:
$(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 }
});
<% } %>
}
);
Se ele não funciona, vá em frente e cole o javascript gerado também.
Outras dicas
Use esta:
cs.RegisterClientScriptBlock(cstype, csname, cstext2.ToString(), False)
É falso para não criar as tags de script desde que você está incluindo-los. A documentação MSDN está errado na forma como ele explica a bandeira.
Além disso, basta colocar o ID do cliente é de seus controles em variáveis ??separadas do código por trás, e não o jQuery código .
Em seguida, use as variáveis ??que contêm os ids vez em código jQuery.
Dentro do seu bloco de script que você criar no código por trás:
string script = @"<script type=text/javascript> var myControlId = '" + ddl.ClientId "';") + "</script>"
Eu não verificar essa sintaxe, mas deve estar perto. Você pode adicionar a sintaxe adicional para si mesmo grvTimeSheets.ClientID
. Se você começar este trabalho, então você pode querer mudá-lo para construir uma matriz de JavaScript e armazenar da ClientId dessa maneira, e, em seguida, você só tem uma variável global JavaScript que você precisa para trabalhar.
Outra opção é apenas dar o elemento que você está procurando um nome de classe que descreve o seu comportamento. Em seguida, seu código jQuery torna-se muito claro:
$(function() {
$("select.yourMarkerClass").change(....);
});
Se não houver nenhuma linha de edição, então este código não faz nada. Se houver um elemento que combina com o seletor, você vai ter o novo comportamento acrescentou.
Se você não está usando o mesmo ID em outro lugar na página, você pode frustrar ASP. NET 's UniqueID com um dos seletores avançados do jQuery:
$('[id$=ddlClients]')
Esta corresponde apenas ao final da string id ao invés do todo. Tenha em mente, se o controle está presente várias vezes dentro de linhas diferentes, isto irá corresponder a todos os casos.
Veja Seletores para mais exemplos.
Eu usei o Page.ClientScript propriedade para registrar um bloco de script para conter necessidade I de qualquer id para acesso com jQuery.
Aqui está um exemplo do meu JavaScript em um arquivo externo:
var myFancySelector = '#' + myControlId;
selectedValue = $(myFancySelector).val();
myControlId é definido a partir do código por trás e registerd na ClientScriptBlock.
A chave pode ser o que quiser, deve ser embora único.
Vou tentar mais após o fim de semana. Este foi o código, no entanto:
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);
Porque você tem uma lista suspensa em cada linha. Cada suspensa terá um único ClientId, então eu sugiro fazer o que Ben sugeriu e use o seletor de classe, uma vez que é a solução mais simples.
Ou você poderia criar uma função JavaScript em sua edição clique e, em seguida, obter o ID de cliente exclusivo do seu suspensa nessa linha que está sendo editado.
Desculpe, eu deveria ter lido o seu código mais perto.