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;
                           
});
   
}
}

sexta-feira, 19 de junho de 2009

Condição SQL Oracle

Criando uma codição no prompt do SQL Plus (Oracle):

declare

v_count number;

begin

select count into v_count from all_tables where table_name=v_nome_tabela;

if v_count > 0 then

drop table v_nome_table as cascade;

end if;

end;

 
"No caso" é um se a tabela existe então faça o drop. É isso.

Update Panel na MasterPage via SubPage

Cenário: Um página com masterpage, updatepanel na masterpage, e na subpage outro updatepanel.
Situação: Quando é feito post na subpage precisa atualiza o updatepanel da masterpage.
Porque: Neste post é atualizado valores de controles da masterpage que precisão ser exibidos
 

((UpdatePanel)Master.FindControl("updatePanelMaster")).Update();

 
Nota: Se seu updatepanel é muito pesado, (+ de 5 quilos de controles), recomendo fazer po javascript como já demonstrado aqui.
 
 

quinta-feira, 18 de junho de 2009

System.Linq.OrderedEnumerable tipo System.Collections.Generic.List

Problema: Não tenho com alterar o XML do mapeamento do nHibernate para ordernar a query
Solução: Implementar um especifica ordenação no GetAll()
 
        public IList<qqClass> GetAll()
        {
               return qqClass.GetAll().OrderBy(qqClasses => qqClasses.Name).ToList<qqClass>();
        }
 
Comentários: Não tem como fazer direto, pois é um Enumerable (linq) com um Collections(list)

How to call client-side Javascript function after an UpdatePanel asychronous (Ajax) request is over

Necessidade: Fazer atualização de um controle que está na masterpage quando retorna do postback do ajax.
Problema: É utilizado no contentpage o updatepanel, atualizando somente os controles que estão no updatepanel, a masterpage não sofre refresh.
Solução: Adicionar (registrar) uma função javascript e O COMANDO.
 
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(suaFunctionJavaScript)
 
em seu page load você pode colocar:
 
if (!Page.ClientScript.IsClientScriptBlockRegistered(UpdatePanel1.GetType(), "resetDefaultFired")) {
    string resetGlobalVar = "function message() { document.getElementById('" + (Master.FindControl("lblMessage") as  Label).ClientID + "').innerHTML = document.getElementById('" + lblMessage.ClientID + "').innerHTML; }";
resetGlobalVar += " Sys.WebForms.PageRequestManager.getInstance().add_endRequest(message); ";
Page.ClientScript.RegisterStartupScript(UpdatePanel1.GetType(), "resetDefaultFired", resetGlobalVar, true
);
}
 
Então você envia o que você quer para um controle "lblMessage" e o outro controle "master lblMessage" recebe.
 

terça-feira, 14 de abril de 2009

Crie condições para seus Breakpoints

Não é todo hora e para toda situação que você deseja parar em um breakpoint, então use:

image

Breakpoints Window

Crtl-Alt-B –> Veja seus breakpoints

image

Controles – Debug ToolBar

F5 –> Start/Continue (até o próximo breakPoint)
Crtl-Alt-break –> Para tudo, bem na linha!
Shift-F5 –> Para de debugar.
Crtl-Shift-F5 –> Para o atual e começa um novo debug (restart)
F11 –> Vai para próxima linha.
F10 –> Vai para próxima “etapa”
Shift-F11 –> Se a linha atual é um metodo ou função, executa até o fim deste e vai até o próximo ponto. (not breakpoint).

Status comuns do HTTP

Categoria

Number

Descrição

Informação (100-199)

100

Continue
Sucesso(200-299)

200

OK
Erros no Cliente

400

Bad Requests (chamou errado brother)

401

Unauthorized (não autorizado brother)

403

Forbidden (Proibido brother)

404

Not Found (não achou/encontrado brother)

408

Request timeout (demorou muito, tá embaçando brother)
Erro no Servidor

500

Internal Server Error( ai fu… brother)

O mesmo para Session State

Para incrementar performace as suas páginas, caso não utilize sessões:

<%@Page... EnabledSessionState=”false” %>

Desabilitando o ViewState

Os view states causam impacto na banda (bandwidth) transferida. Para obter melhor performace neste ponto você pode desabilitar está opção (que vem por padrão)

Na declaração da pagina <%@ Page Language=”C#” EnabledViewState=”false” %>

View State

View State é salvado em uma campo hidden. Assim é uma técnica que funciona em qualquer browser. Porém a informação salvada não é criptografada. Esta somente codificada em Base64. Esta não é uma informação imune de ser vista.

Habilitando o histórico com o ScriptManager

Quando você está fazendo seus submits e requests com o “Ajax” ScriptManager, você não terá os histórico no browser. Para conseguir este efeito:

Nas propriedades do componente ScriptManager altere o EnabledHistory para true.

Para criar o histórico em seu code behind você precisa adicionar os pontos. Então no evento em que você alterar os controles ou valores da tela, seja um botão de submit ou click com autopostback você fará:

ScriptManager1.AddHistoryPoint(“Nome do Ponto”,strValordoControle,strTitulodoHistorico);

Para recuperar os valores adicione o evento:

protected void ScriptManger1_Navigate(object sender, HistoryEventsArgs e)
{

if (!string.IsNullOrEmpty(e.State(“NomeDoPonto”){
     strValor = e.State(“NomeDoPonto”);
}

Page.Title = “Voltamos ao ” + strValor;

}