quarta-feira, 15 de julho de 2009

Erro em tempo de execução do Microsoft JScript: '__pendingCallbacks[...].async' é nulo ou não é um objecto.

Você está utilizando callbacks e se depara com o erro:

__pendingCallbacks[...].async' is null or not an object

Esse é o código original: em negrito - for( i = 0 - o problema, e logo mais em negrito tb aonde ocorre o problema:


// Código original, gerado pelo asp.net 
function WebForm_CallbackComplete()    
 {       
  for (i = 0; i < __pendingCallbacks.length; i++)   
   {
    callbackObject = __pendingCallbacks[i]; 
    if (callbackObject == callbackObject.xmlRequest(callbackObject.xmlRequest.readyState == 4))
     {
      WebForm_ExecuteCallback(callbackObject); 
      if (!__pendingCallbacks[i].async)   {
      __synchronousCallBackIndex = -1;
      } 
      __pendingCallbacks[i] = null; 
      var callbackFrameID = "__CALLBACKFRAME" + i; 
      var xmlRequestFrame = document.getElementById(callbackFrameID); 
      if (xmlRequestFrame) { 
      xmlRequestFrame.parentNode.removeChild(xmlRequestFrame); 
      }  
     }               
    }              
   }  
 }
 
O problema:
O i de for( i = 0 está como uma variavel global e não pode alterar dentro do ciclo.
O que fazer? adicione um var para torna-la local.
for(var i = 0
A solução completa e subitiuindo a função fica (coloque o script em sua página);

ClientValidate com Validation Group

Para verificar se a página é valida utilizando somente um grupo de controles, via javascript, utilize:
 
<script language="javascript>
if (Page_ClientValidate('buttonSubmit.ValidationGroup') ) {
    //do your script
}
</script>

Habilitar o Validador e Forçar validação via JabaScript

Enable a validator via javascript

O metodo para habilitar ou desabilitar o validador é:

function ValidatorEnable(val, enable)

aonde val é a referencia para o <span> do elemento validador, ou seja o clientID do validador, o enable  é o true ou false para habilitar ou desabilitar

Force a validation via javascript

Caso você queria validar (ativar, funcionar, excutar...) o validador:

function ValidatorValidate(val, validationGroup, event)

val é você viu acima, validationGroup  é o nome do grupo que você do seus controle, caso não esteja usando pode deixar... afinal, utilizando somente o primeiro parametro já funciona.

Fazer click do botão via javascript

$get(btn).click();

Page_ClientValidate e ValidatorValidate

Caso você precise em JavaScript verificar se a página é válida, utilizando os controladores em asp.net (validators) você pode usar:
 
if (Page_ClientValidate()) {
 
}
 
Porém antes disso você pode querer forçar via javascript os validadores, então utilize:

ValidatorValidate(document.getElementById('RangeValidator1.ClientID'));

Este comando irá força o validador, caso seja esteja dynamic ou static, irá apresentar a mensagem.

Caso você precise deste situação para o summary... não tem, e nem o faça. Basta colocar os controles como lista aonde você deseja o Summary.

 

Click e eventos de botões com WebForm_DoPostBackWithOptions e new WebForm_PostBackOptions

 Caso você precise executavar via javascript, algo como <scritp> fazClickbotao() </script> em sua página e precisa
 recuperar o comando que o asp.net gera para o botão basta colocar em seu ClientScript.RegisterClientScriptBlock:
 ClientScript.GetPostBackEventReference(btnSeuBotao, null)
 Quando você olhar o fonte da página irá ver que gerou a função do seu botão, use como for, eu usei para um CallbackEvent
 

terça-feira, 14 de julho de 2009

Predicate Delegate

Um predicate é uma função que retorna true ou false. O predicate delegate é uma referencia para o predicate.

Então basicamente um predicate delegate é uma referencia para uma função que retorna true ou false. Predicates são normalmente aplicáveis para filtar lista de valores. Veja um exemplo:

using System;
using System.Collections.Generic;

class Program
{
   
static void Main()
   
{
       
List<int> list = new List<int> { 1, 2, 3 };

       
Predicate<int> predicate = new Predicate<int>(pegueMaiorQueDois);

       
List<int> novaList = list.FindAll(predicate);
   
}

   
static bool pegueMaiorQueDois(int arg)
   
{
       
return arg > 2;
   
}
}

Agora se você utiliza o C# 3 você pode usar uma expressão lambda para representar o predicate:

using System;
using System.Collections.Generic;

class Program
{
   
static void Main()
   
{
       
List<int> list = new List<int> { 1, 2, 3 };

       
List<int> novaList = list.FindAll(i => i > 2);
   
}
}
Você também pode de um jeito direto, colocar a função:
 
using System;
using System.Collections.Generic;

class Program
{
   
static void Main()
   
{
       
List<int> list = new List<int> { 1, 2, 3 };

       
List<int> newList = list.FindAll(delegate(int arg)
                           
{
                               
return arg> 2;
                           
});
   
}
}