Welcome to Linha de Código Sign in | Join | Help

Debugando pelo codigo fonte do .NET COM VS2008

Sim agora é possível , já podemos debugar e entender melhor o funcionamento do  Framework .NET!


Veja na integra  mais detalhes pelo blog do grande 
ScottGu
posted by FCerqueira | 2 Comments

Sys is undefined : “Ajax X Hora do Sistema”. AJAX ou .NET Framework ?

Introdução:

Já faz um bom tempo que não posto nada e aqui uma explicação: Transferi-me para São Paulo e ate ajustar tudo esta sendo bem mais demorado do que previa...

Costumo sempre dar uma pesquisa pela web sobre AJAX para ver como a comunidade vem absorvendo esta funcionalidade que hoje é indispensável para qualquer aplicativo web.  

Um post  em  um blog me chamou atenção hoje.  Não pelo seu conteúdo, mas pela dúvida gerada dentro de um cenário que dificilmente acontece.  Como lá só tinha o problema que apontava para o AJAX , sem a causa e explicação dos motivos resolvi escrever este pequeno post para compartilhar com a comunidade alguns fundamentos e conhecimento sobre este cenário . Afinal não adianta nada trazer problemas sem soluções e a devida pesquisa , isso pode leva a outra conclusão.

Qual é o cenário que estamos  falando :

Você esta criando um aplicativo web  habilitado para usar Ajax. A aplicação criada esta correta, o arquivo de configuração esta perfeito e o servidor também este corretamente configurado com os assemblys do AJAX devidamente registrado no GAC.  Ao executar o aplicativo aparece a mensagem de  “Sys is undefined”.  Verificando a Data do servidor você percebe que a Data esta errada (com alguns anos para trás...). A solução imediata é simples : É só corrigir a Data, porem o que chamou atenção foi justamente a dúvida deixada :

“Mas por que diabos recusar uma data desatualizada, só porque ele não existia na época? Tudo bem que sabe-se lá porque alguém precisaria disso, mas e se eu precisar do meu servidor com a data em 2002 ?”

A dúvida é mais que justificada!  porem não existe nenhuma relação com a existência ou não do produto na época.

A idéia deste post é entender melhor o que esta acontecendo, como funciona o AJAX ASP. NET e alguns outros detalhes do Framework .NET . Ao final descobrir as respostas e dar um “workarround” para este cenário caso seja necessário.

Para se chegar à explicação iremos precisar usar uma ferramenta(que inclusive já citei neste blog) como fundamentais para qualquer desenvolvedor:

http://linhadecodigo.com.br/cs2/blogs/fcerqueira/archive/2007/02/22/588.aspx

“Refletor (Embora muitos achem que a intenção é descompilar e ver o código fonte, estas ferramentas tem uma tarefa mais nobre :  Facilitar o entendimento do .NET framework,
Ajudar a melhorar a performance e reduzir os cast, Uma grande fonte de aprendizado”

A mensagem de Erro para o usuário :

“Microsoft JScript runtime error: 'Sys.WebForms.PageRequestManager' is null or not an object”

Esta mensagem normalmente  ocorre quando não temos instalado (diga-se registradas) as dlls do AJAX. Mas esta mensagem (neste nosso caso) é uma conseqüência e não origem do erro uma vez que tudo esta registrado  de forma correta.

Entendendo melhor:

O AJAX é formado por um conjunto de bibliotecas que estão no lado do servidor e no lado do cliente.  Quando tornamos nossos aplicativos habilitados para Ajax as requisições são interceptadas pela biblioteca que esta no servidor que executa o devido tratamento, inclusive incluído na página que retorna para o cliente os script necessários   (Veja o exemplo abaixo) :

...
<script src="/AJAXEnabledWebSite1/ScriptResource.axd?d=GVl2-bmV...&amp;t=633022221745931040" type="text/javascript"></script>

O  ScriptResource.axd  é um recurso introduzido no Framework 2.0 que permite trabalhar com os resouces anexados no Assembly . Sua estrutura  é desta forma :

WebResource.axd?d=recurso & t =Tempo.   "d" significa o recurso da Web solicitada que vem encripitado e o "t" é a data/hora para o assembly solicitado. O parâmetro “t” ajuda a identificar se houve alterações feitas o recurso.

Para quem desejar saber um pouco mais, abaixo um artigo no MSDN que trata deste assunto :

http://support.microsoft.com/kb/910442/pt-br

A mensagem de Erro de origem:

Agora conhecendo melhor esta premissa de como os script são gerados e enviados, podemos partir para a origem do problema, testando a execução dos script  que retorna a mensagem real de origem abaixo :

Specified argument was out of the range of valid values.
Parameter name: utcDate

...
Exception Details: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: utcDate

...
Stack Trace:

 [ArgumentOutOfRangeException: Specified argument was out of the range of valid values.

Parameter name: utcDate]

   System.Web.HttpCachePolicy.UtcSetLastModified(DateTime utcDate) +3299747

   System.Web.HttpCachePolicy.SetLastModified(DateTime date) +47

 mpletedSynchronously) +64

...

 

Ok, até aqui quase nenhuma novidade. Apenas identificamos a origem do erro, mas ainda restam duas perguntas: Porque deu este erro?  Como posso contornar o problema mantendo a data do servidor (mesmo que desatualizada)?  Vamos então continuar para termos  as respostas J

Porque deu este erro ?

Para responder vamos usaremos dois recursos: O Refletor (para ver a lógica e codigo que o framework utiliza)  e o código fonte do AJAX.NET .

Para quem não sabe o código fonte do AJAX.NET  esta disponível para estudo e para debug em :
http://www.microsoft.com/downloads/details.aspx?FamilyID=ef2c1acc-051a-4fe6-ad72-f3bed8623b43&DisplayLang=en

O erro apresentado é no método  UtcSetLastModified da classe  System.Web.HttpCachePolicy. 
Usando o Refletor temos os seguintes códigos abaixo:

public
void SetLastModified(DateTime date)
{
    DateTime utcDate = DateTimeUtil.ConvertToUniversalTime(date);
this.UtcSetLastModified(utcDate);
}
private void UtcSetLastModified(DateTime utcDate)
{
   utcDate = new DateTime(utcDate.Ticks - (utcDate.Ticks % 0x989680L));

    if (utcDate > DateTime.UtcNow)
    {
       throw new ArgumentOutOfRangeException("utcDate");
    }

if (!this._isLastModifiedSet || (utcDate > this._utcLastModified))
   {
        this.Dirtied();
        this._utcLastModified = utcDate;
        this._isLastModifiedSet = true;
  }
}

O Texto em vermelho grifado é o trecho de código responsável pela mensagem de erro, ou seja: caso a data passada seja maior que a data corrente ocorre uma exception.

Mas que Data é essa que é passada como parâmetro?

Agora precisamos usar o segundo recurso de analise: O Código fonte do AJAX ASP.NET.

Como estamos tratando uma requisição de resource já explicada, se buscarmos pelo titulo dos arquivos iremos encontrar um arquivo de nome: ScriptResourceHandler.cs 
 e dentro dele temos o método abaixo :

private static DateTime GetLastWriteTime(Assembly assembly)
{
            string codeBase = GetCodeBaseWithAssert(assembly);
            Uri codeBaseUri = new Uri(codeBase);
            if (!codeBaseUri.IsFile) return DateTime.MinValue;
                string localPath = codeBaseUri.LocalPath;
            FileIOPermission p = new FileIOPermission(FileIOPermissionAccess.Read, localPath);
            p.Assert();
            return File.GetLastWriteTime(localPath);
}


Analisando o código o leitor poderá perceber que o parâmetro passado é a data do assembly que possui o resouce a ser incluído.

Explicando o motivo de erro apresentado:

De um lado temos um assembly que foi gerado com uma determinada Data, e de outro lado temos a Data corrente do servidor .

Como a Data do assembly é superior a data Corrente do servidor temos uma inconsistência que é verificada pelo Framework! Ou seja, o erro gerado não é do AJAX e sim do próprio  .NET framework  que executa a verificação  de data.

Respondendo a segunda pergunta:  Caso seja necessário ter um servidor com data desatualizada e ainda assim executar assemblys que foram gerados com data superior a data corrente ?

Como se trata de um cenário extremante atípico precisamos  fazer um
“workarround”  (contornar o problema) . A forma mais simples é modificar a data do assembly e para isso podemos usar váriso aplicativos para este fim, um deles  é o File Touch utility  http://www.jddesign.f2s.com/touchpro.htm.

Conclusão :

Objetivo deste artigo/post foi apenas detalhar algumas funcionalidades que muitas das vezes passa despercebida pela maioria dos desenvolvedores e reforçar alguns conceitos sobre o desenvolvimento na web.

Um dos pontos que sempre reforço nos trabalhos de mentoring  que exerço é a necessidade de se conhecer bem os fundamentos  da web e das tecnologias  envolvidas para podemos ter uma compreensão melhor dos cenários e problemas que sempre irão surgir e com isso podemos fazer uma analise mais clara das origens dos problemas evitando-se com isso se chegar a conclusões que podem ser equivocadas.  Claro que este cenário apresentado não é trivial e requer uma analise em maior profundidade para se tirara algumas conclusões.

Espero ter dado uma pequena parcela de ajuda para que os desenvolvedores se interessem em compreender melhor os fundamentos e não apenas os resultados.
posted by FCerqueira | 1 Comments
Filed Under: ,

Testando WebParts com o ASP.NET AJAX 1.0

Ontem fiquei fazendo alguns testes com webparts e Ajax e resolvi criar este resumo e compartilhar com vocês :

Posso usar webparts com ajax ?

Minha resposta SIM.

Para usar webparts com ajax  não preciso fazer nada ?

Minha resposta e não, você precisa fazer sim! Infelizmente nem todas as funcionalidades de webparts  foram implementadas , tanto é que ela não faz parte da versão RTM e sim da versão “Future” . Veja as limitações (sem fazer nada) em

http://forums.asp.net/thread/1545256.aspx 
ou em
http://blogs.msdn.com/mharder/archive/2007/01/23/webparts-and-asp-net-ajax-1-0.aspx

Então só posso Ajax com a versão “FUTURE” ?

Minha resposta e não, PODE IR ALEM, VOCE PODE USAR WEBPARTS COM A VERSÃO ASP.NET AJAX  1.0!!!!!!!!!!!!!!!!!.

E posso usar Ajax com Webparts em produção?

Minha resposta e não, mas por quê?  Por que embora as funcionalidades de Drag and Drop passem a funcionar com as soluções que demonstro mais abaixo, ainda precisa ser amadurecida e melhorada, inclusive se pensando em cross-browser. 

O Objetivo aqui  é compartilhar o conhecimento e mostrar que é possível fazer funcionar webparts com Ajax , quem acompanhou a evolução lembra que durante os ctps  a compatibilidade entres os browses veio depois , como em qualquer amadurecimento de código.

Mas como é possível? Já li que isso é mito uma lenda não é fato....

Minha resposta é que leia ate o final e depois tire a conclusão do que é lenda e que fato e pode ser feito, e conclua você mesmo, afinal não estou aqui para ficar demostrando o que não funciona e sim para compartilhar conhecimento  e aprender junto com a comunidade , ou seja com vocês.


Mas esta solução é sua?

Não. Estava trabalhando em uma solução para este cenário, porem meu trabalho foi abreviado por encontrar uma solução bem mais adiantada e seguindo o mesmo raciocínio que  o meu.

Mas afinal qual é a Mágica?

Bem antes de mostrar como é a mágica, vamos entender o que não funciona:

Uma das principais funcionalidades de usar webparts é você poder mover as webparts entre as webzones. Uma das coisas desagradáveis era que quando fazia isso para cada webparts que você movia era executado um postback e página era toda carregada.

Com a chegada do AJAX  isso pareceu ter sido resolvido de uma forma  muito elegante não ocorrendo mais o postback, tornando a usabilidade bastante atraente. Infelizmente  esta funcionalidade com o Ajax foi retirada nas versões betas e também  na versão RTM 1.0, sendo deixada para ser implementada em versões futuras.
Quando colocamos as webparts e o wepartmananger dentro do updatepanel o drag and drop  não funciona corretamente.  

Mas porque não funciona? 

É aqui que começa a mágica
.  Se observar o comportamento quando esta dentro do updatepanel ira perceber que funciona na primeira vez e depois quando é feito o “Partial render” pelo scriptmananger não é possível mais executar o drag and drop.  Este efeito indesejado esta centrado em um único componente: 

O webpartmananger.

O webpartmananger  que é responsável por gerar e registrar os scripts com as funcionalidades. Este script é que são os responsáveis pela funcionalidade Drag and drop, os Verbos dos menus e outras funcionalidades das webparzones.

Desta forma então será o webpartmananger que teremos que modificar para que o webparts funcione corretamente.

Mas porque precisamos modificar ele (webpartmananger) ? 

Porque quando colocamos ele dentro do updatepanel durante o primeiro render ele carrega os script  e executa as funcionalidades, mas depois do primeiro “Partial render” o Webpartmananger não consegue mas registrar os scripts e “se perde” criando exatamente  o comportamento  já descrito de apenas executar somente 1 vez, isso se explica porque o responsável por isso é o scriptmananger quando trabalhamos com  AJAX.
Simples não é..... São estes conceitos que ajudam a você a resolver cenários onde existe  pouca documentação e recursos existentes.

Vocês já leram  também pelo meu blog que os validators também  tem problemas quando usando dentro do updatepanel (principalmente dentro de templates de grids que estão dentro dos updatepanels) . A solução para os validtors foi mapear as classes responsáveis pelos controles para outra classe que resolver o problema.

A solução para webparts é feita da mesma forma! Justamente por este caminho que estava trabalhando quando me deparei com outra solução feita por outro desenvolvedor segundo exatamente esta linha!

Mas o que deve ser feito?

Primeiro criar  uma classe que herde do WebpartMananger e sobre-escrever o RenderClientScript (para se ter o controle do se se escreve na pagina). Com isso registramos os scripts pelo System.Web.UI.ScriptManager e não mais pelo System.Web.UI.ClientScriptManager

Esta simples mudança faz com que os script registrados sejam executados a cada refresh do updatepanel  que  é controlado pelo scriptmananger.

Estava bem próximo disso quando encontrei esta solução que estou descrevendo. 

Para completar a solução será necessário mapear as  classes do System.Web.UI.WebControls.WebParts.WebPartManager  para a classe que esta sendo criada da mesma forma que foi feita a solução para os validators.

<configuration>
    <system.web>
        <pages>
            <tagMapping>
            <add  
            tagType="System.Web.UI.WebControls.WebParts.WebPartManager"
            mappedTagType="Sample.Web.UI.WebParts.WebPartManager, Sample.Web.UI.WebParts"
            />
            </tagMapping>
        </pages>
</system.web>
</configuration>

E o código ? 
Vamos a explicação de algumas partes dele :

Como já falamos a classe herda de System.Web.UI.WebControls.WebParts.WebPartManager e o trecho abaixo mostra como esta sendo registrado o script necessário junto ao ScriptManager e depois durante a statup para garatir o resfresh do updatepanel.

Public Class WebPartManager
    Inherits System.Web.UI.WebControls.WebParts.WebPartManager

    Protected Overrides Sub RegisterClientScript()
        If Me.CheckRenderClientScript Then

            System.Web.UI.ScriptManager.RegisterClientScriptResource(Me,
            GetType(System.Web.UI.WebControls.WebParts.WebPartManager),
             "WebParts.js")

            System.Web.UI.ScriptManager.RegisterStartupScript(Me,
            Me.GetType, Me.ID & "_Script", Me.Script, True)

        End If
    End Sub

Abaixo parte de o script  necessário ser executado durante o startup.

    Private ReadOnly Property Script() As String
        Get
            Dim colorConverter As New System.Web.UI.WebControls.WebColorConverter
Dim _clientScript As String = String.Format("__wpm = new
 WebPartManager();{0}" & _
            "__wpm.overlayContainerElement =
 document.getElementById('{2}___Drag');{0}" & _
            "__wpm.personalizationScopeShared = {1};{0}" & _
"var zoneElement;{0}var zoneObject;{0}",
ControlChars.CrLf, Me.Personalization.CanEnterSharedScope.ToString.ToLower, Me.ClientID)
            For Each z As WebPartZone In Me.Zones……
            Return _clientScript
        End Get
    End Property

Você deve estar se perguntando como é possível saber que código escrever  para se chegar a este resultado ... Aqui Tb não existe nenhuma lenda nem nenhum “super guru” ..rs.rs, quem acompanha meu blog em  http://linhadecodigo.com.br/cs2/blogs/fcerqueira deve se lembra de uma dica que dei da nova versão do :

“Refletor 5.0 - Uma ferramenta indispensável” (http://linhadecodigo.com.br/cs2/blogs/fcerqueira/comments/588.aspx

No blog disse

“Embora muitos achem que a intenção é descompilar e ver o código fonte, estas ferramentas tem uma tarefa mais nobre :  Faciliar o entendimento do .NET framework.  Ajudar a melhorar a performance e reduzir os cast Uma grande fonte de aprendizado” 

E ai esta a outra parte da mágica, aprender  mais sobre o funcionamento vendo como é realizado as rotinas.

Uma pergunta final que pode ser feita : Esta solução é crossbrowser ?

Infelizmente não é, por enquanto esta solução esta compatível apenas com o Internet Explorer , porem mostra  que com um pouco de conhecimento pode-se se chegar a uma solução. O  legal de compartilhar conhecimento é poder mostrar os avanços, os caminhos . Compartilhando estes caminhos e códigos outros desenvolvedores aprendem melhor o funcionamento e pode evoluir a solução até chegar a uma maturidade de código que permita o uso em usa plenitude

Onde posso pegar todo o código fonte ?

Esta em um thread no fórum  www.asp.net  : http://forums.asp.net/thread/1621227.aspx 

Quem inica a thead e o propio autor da classe, a ele que devemos dar o grande parabens . De minha parte estou apenas ajudando a divulgar e compartilhar com vocês.

A todos um grande abraço

 

posted by FCerqueira | 0 Comments

ASP.NET AJAX / AJAX Control Toolkit - WebCast!

Realizamos neste sábado (24/03) o Webcast "Saturday Night Code - Desvendando segredos do ASP.NET AJAX e do AJAX Control Toolkit".

Este evento contou com a participação de 3 MVP'S  : Diego Neufert , Marcelo D'Avila de Pauli e Fernando Cerqueira. Foram 4 horas de muitas informações dicas e muitos códigos.

O evento tem tudo para entrar na historia como o maior evento do MSDN vejam os números :

*  + de 2.000 incrições
* Aproximadamente 700 logins distisntos
* as 02:00 da manhã! tinhamos + de 120  logins no chat tirando dúvidas

Uma coisa legal de se falar que Eu e o Diego precisavamos fazer uma demo de criação de um controle usando o AJAX toolkit  que deveria ser simples porem demonstrando de forma clara todos os aspectos das modalidades possíveis de uso do AJAX , desde usando apenas o modelo Server-Centric ate o Modelo Client-Centric. Isso foi feito  em apenas 30 minutos desde o Zero, demostrando que a ferramenta realemente é muito produtiva.

A todos que participaram do Webcast nosso muito obrigado!

MS Ajax Versão Final - O que realmente mudou Quando e Porque

Fico sempre feliz em ver novos artigos e assuntos sobre AJAX.NET em nossa língua. Algumas das vezes ocorrem alguns "deslizes" e a informação passada nestes artigos não é correta ou imprecisa. Sempre que escrevemos um artigo corremos o risco de errar, seja por descuido, seja pelo fato de não conhecer os detalhes da implementação...., Claro que isso não desmerece o artigo nem seu autor, em 90% dos casos os artigos são ótimos e atingem seu objetivo.

Como MVP,  acabo tendo a preocupação de estar compartilhando corretamente a informação para uma perfeita compreensão do desenvolvedor e por conseqüência a melhor utilização dos recursos e das tecnologias envolvidas e discutidas.

Este fim de semana me deparei com alguns destes artigos (em diversos sites) com pequenos “deslizes” que podem dificultar ou ainda se tirar conclusões erradas de como utilizar o AJAX.NET.

Como já tinha prometido em várias palestras falar um pouco mais em detalhes do AJAX,  resolvi então compartilhar neste blog alguns dos detalhes que  saíram na versão final do AJAX.NET que eventualmente são passados com alguns “enganos”.

A estrutura do AJAX.NET :

o Ajax.Net possui apenas uma única biblioteca e não várias. Por se tratar de um framework que interage tanto com o lado cliente como o lado servidor da aplicação sua estrutura é divida  assim:

Ajax Extensions - Núcleo do lado servidor onde se encontra os Server-Controls. São estes controles que permitem tornar as aplicações "AJAX Enabled" pelo modelo de programaçãp Server-Centric.

A dll do AJAX Extension já possuem as bibliotecas do AJAX Library (Elas estão embeding na DLL System.Web.Extensions).



Ajax Library – Núcleo do lado cliente onde se encontra as bibliotecas em Javascript. Por se tratar de um conjunto de funcionalidades escritas em Javascript  sem dependências direta do AJAX Extensions pode ser usada em ambientes e linguagens que suportam javascript tais como PHP. Esta biblioteca é a mesma que se encontra no AJAXExtension . É pelo uso desta biblioteca que tornamos as aplicações "AJAX Enabled “ pelo modelo de programação Client-Centric.

Um “mix” de ambos os recursos normalmente é o desejado quando queremos tirar o máximo de proveito da produtividade obtida no modelo Server-Centric e o máximo de flexibilidade e controle encontrados no modelo Client-Centric. 

Alem da versão RTM do Ajax.Net  a MS vem disponibilizando para comunidade uma versão chamada “AJAX Future XXX CTP” onde XXX é referente ao mês que foi lançado. Esta versão possui a mesma estrutura da versão RTM, porem é incluída alguns controles e funcionalidades que poderão fazer parte do produto em versão futuras. O objetivo desta versão é que a comunidade possa testar e dar feedbacks em relação aos novos recursos, sendo assim, algumas destas funcionalidades podem não estar completas nem são suportadas oficialmente.

O AJAXTOOLKIT

O AJAXToolkit embora esteja diretamente ligado ao produto AJAX.NET não faz parte do produto e pode ser “baixado” posteriormente.  O AJAXTOOLKIT é um conjunto de controles que faz uso do núcleo do AJAX.NET.

Seu objetivo é ser uma caixa de ferramenta de controles que facilitam o desenvolvimento de interfaces ricas com o uso de AJAX.

Atualmente existem mais de 30 controles criados para as mais diversas finalidades, e entres eles, um de nossa autoria, e dentro em breve, teremos mais outros 2 controles que estamos trabalhando. 

De um modo geral os controles são do tipo Extender, ou seja, eles expandem as funcionalidades de um controle já existente fornecendo novas funcionalidades e comportamentos.

Em seu útimo release foi incluído o suporte a globalização de mensagens, aplicação de themes e consolidado o uso de CSS resource (uma fantástica feature).

Atualmente todo o team esta focado e garantir uma melhor estabilidade de todos os controles já publciados, para depois podemos avançamos com novos controles, mas posso adiantar  que existem pelo menos 2 grandes controles sendo desenvolvidos :

a) MenuContext 
b) AJAX WYSIWYG Editor

alem dos 2 controles que estamos criando :

c) TextCount Multiline 
d) Calulator Control.

Um dos grandes atrativos do AJAXTOOLKIT que ele esta hospedado no site Codeplex (
http://www.codeplex.com/AtlasControlToolkit), tendo seu código aberto e comentado. Isso permite que a comunidade possa interagir com o Team de desenvolvimento apontando bugs e melhorias, alem claro de ser uma fonte muito rica de exemplos de código usando o modelo Client-Centric. O Ajax Toolkit também possui um template para ser instalado no VS que facilita muito a criação de novos controles já criando uma estrutura padrão.


WebParts em AJAX.NET

O suporte para WebParts no AJAX.NET não esta disponível em sua versão RTM  1.0 . Durante o desenvolvimento até a entrada da versão beta fazia parta da versão CTP. Nas versões betas já houve a separação, pois ainda teremos muitas mudanças nestes cenários (provavelmente em função do “Orcas” que já promete grandes novidades). Sendo assim,  esta funcionalidade ficou na versão “Future” e a exemplo de outros recursos como DragAndDrop . O núcleo dos controles de Webparts será substituído quando ela fizer parte da versão final (como esta sendo feito com os controles Validators – Ver a seguir).

Uma dica para quem for testar a versão “Future January CTP” é que se torna necessário fazer o mapeamento das tags para que funcione de forma correta uma vez que os controles de webparts que vem por default no asp.net não estão preparados para interagir com o AJAX. Isso é necessário porque os controles webparts estão reescritos em outro namespaces (Veja figura abaixo). 



O mapeamento pode ser visto no arquivo web.config que  esta no mesmo diretório da versão “Future”.

A thread abaixo mostra um resumo ,porem muito claro do que podemos fazer com WebPats usando a versão "Future January CTP"

http://forums.asp.net/thread/1545256.aspx

Validators em AJAX.NET

O suporte para validator no AJAX.NET não foi retirado propriamente dito, na maioria dos cenários usuais o núcleo do AJAX.NET da o suporte adequado.

Um dos problemas de compatiblidade é quando os validator estão dentro de UpdatePanel em determinadas situações ele não é capaz de resolver o render e localização do controle (normalmente durante o processo de partial render).  Isso ocorre porque ele não acha o elemento DOM referente ao validator, pois o “parent” do controle esta sobre o updatePanel e o script do asp.net faz a busca pelo array “Page_Validators“ que tem seu “parent” para nothing ou outro elemento acima.

Uma forma de resolver isso foi criação de  uma biblioteca de compatibilidade (aconteceu na versão beta1)  e incluir o suporte ao validator  dentro do AJAX.NET mapeando as tags originais para os novos controles. Infelizmente esta abordagem trouxe problemas uma vez que controles criados pelos desenvolvedores que herdavam da classe System.Web.UI.WebControls.BaseValidator  precisariam ser alterados para herdar da classe de compatibilidade o que gera diversos problemas com legados e confusão de qual classe será usada como herança. 

Sendo assim já na versão BETA2 do AJAX.NET  esta classe de compatibilidade  foi  retirada e passamos  novamente utilizar as classes originais (Sofri com isso pois precisei rever um de meus controles do já estava em fase de publicação no AJAX Toolkit) .

Na versão final este conceito foi mantido, e será feito uma atualização no núcleo do Framework (via Windows Update) para atualizar as classes originais.  Enquanto esta atualização não chega uma saída é utilizar estas classes de compatibilidade quando necessário. Para isso você devera baixar o código fonte das classes, referenciar em seu projeto a DLL que contem estas classes e alterar o web.config para mapear os validator para esta classe. Todos estes detalhes podem ser visto neste blog:

http://blogs.msdn.com/mattgi/archive/2007/01/23/asp-net-ajax-validators.aspx


UpdateProgress  com mais de um UpdatePanel

Quando passamos a usar AJAX.NET , por não haver refresh de tela,  quando são executadas as chamada assíncronas torna-se necessário darmos um feeedback para o usuário avisando que sua requisição esta sendo processada. Para atender este necessidade foi criado o UpdateProgress presentes desde as versões antigas dos CTPS. 

Umas das muitas solicitações feita pela comunidade durante o desenvolvimento do produto era poder associar o Updateprogress a um updatePanel específico. Estas solicitação foi atendida na beta 2 e na versão final, e passamos a ter a opção de pode ou não associar um updateprogress a um updatepanel especifico através da propriedade AssociatedUpdatePanelIDDemostramos isso em detalhes em nossa palestra durate o TechED2006.

DICA: se a propriedade AssociatedUpdatePanelID ficar vazia , o updateprogress será ativado para qualquer updatepanel presente no formulário, inclusive os que estiverem com a proriedade preenchida, ou seja, Mesmo que tivermos vários updatepanels em uma pagina não precisamos criar um updateprogress para cada um, esta sera uma decisão de usabilidade e não uma restrição do controle como da a enteder em alguns artigos.

O uso do UpdatePanel

Este é o principal componente do lado Server. O updatepanel é um componente que faz a herança do conhecido componente Panel, ou seja, ele é um Container (Componente que permite que seja colocado outros componentes em seu interior). 

Seu objetivo é bastante simples: Tudo que for colocado “dentro” do UpdatePanel passará a interagir com o servidor de forma assíncrona fazendo chamadas pelo objeto XMLHTTP Request sendo controlado pelo controle ScriptManangerAssim quando é feito uma requisição de página esta é feita pelo função Javascript e não mais pela página usando o método Onsubmit.

Um engano comum é achamos que com isso o processo no lado servidor é modificado, Não é!. Continuamos a ter o postback e o disparo e seqüência de todos os eventos normais de uma requisição de página no servidor. O que muda não é o processamento no lado do servidor e sim o controle e gerencia do que será trafegada entre o servidor e a função/classe chamadora no lado cliente (leia-se o código Javascript que foi o responsável pela chamada).

Como existem diversos cenários para as aplicação no mundo real passou a existir a necessidade de  prover algumas funcionalidades extras ao controle updatepanel com o objetivo otimizar as chamadas  evitando roundtrips desnecessárias ao servidor(Quando isso fosse possível).  Esta necessidade levou as mudanças presentes na versão final, que passou a ter uma melhoria significativa sobre o  controle de envio e também quando e como eles são disparados.  As propriedades que dão esta flexibilidade são:

ChildrenAsTriggers : Usado para alterar o comportamento padrão do updatepanel (Que assume que todos os controles em seu interior farão chamadas assíncronas).  Quando esta propriedade é  alterada para “false” , o updatepanel passa e verificar a forma de envio através das propriedades AsyncPostBackTrigger e PostBackTrigger.
 
AsyncPostBackTrigger : Usando para informar quais controles farão chamadas assíncronas. Podem ser informados controles dentro do UpdatePanel ou fora dele. Em ambos os casos o evento postkback gerado pelo controle informado será capturado e tratado pelo scriptMananger evitando-se assim uma chamada ao servidor pela forma tradicional.

PostBackTrigger : Uma vez que podemos alterar o comportamento default do updatepanel para não executar postbaks assíncronos para todos os controles dentro do updatepanel podemos com esta propriedade  informar quais os controles dentro do updatepanel que farão as chamadas ao servidor executando um postback tradicional.

As combinações possíveis com estas três propriedades proporcionam ao desenvolvedor, um leque de opção para criar os mais diversos e complexos cenários, tornado o updatepanel bastante flexível no seu uso e na sua aplicabilidade.

O uso adequado destes recursos possibilita ganhos significativos de desempenho e tráfego, sendo um dos itens que sempre devem ser analisados durante o projeto ou migração para o uso do AJAX.

ScriptMananger

Finalmente chegamos ao ScriptMananger. Este controle, que só aparece em tempo de Design, é o responsável por todas as chamadas e retornos que são feita de forma assíncrona.

É graças a ele que podemos fazer o render parcial da página, localizar quais os controles que serão alterados e como serão alterados. Não houve mudanças significativas durante a passagem da versão Beta para a versão RTM, porem alguns cuidados são necessários em especial quando manipulamos tipos de dados sensíveis a localização.

O AJAX funciona dividindo parte do processamento entre o servidor e o cliente, preferencialmente entregando apenas os dados e deixando para o lado cliente transforma os dados na melhor forma de apresentação, isso todos já sabem.

Todo este processo de divisão se faz serializando os dados de forma que possam ser trafegados entre o servidor e o cliente pelo protocolo Http, isso  nem todos sabem .

É justamente devido ao processo de serialização e “deserialização“ que precisamos ficar atentos quando tivemos manipulando dados do tipo Data (por exemplo) que é sensível a localização. Nestes cenários precisamos de alguma forma avisar, caso seja necessário, ao lado cliente escrito em  javascript , que desejamos que o dado enviado, sofra uma transformação de conversão para a cultura corrente, que pode ou não ser necessário. Justamente neste cenário é que precisamos ativar uma das propriedades do ScriptMananger :

EnableScriptGlobalization :  Seu default é false, ou seja não é feito nenhum tratamento de conversão dos dados serializados. Lembra-se que dissemos que o envio não era mais feito pela página e sim pelo XMLHTTP, por isso precisamos informar como desejamos fazer.

Alguem já teve problemas com acentuação ? Provavelmente sim. Mas sabem porque ? Justamente pro causa deste efeito, uam forma de solucionar e termos uma cultura para UI e outra para os dados que são trafegados, issso claro quando não precisamos manipular os dados pelo javascrit, que é o caso que estamos tratando aqui.

Mais detalhes sobre este assunto pode ser visto em :

Sobre a proriedade EnableScriptGlobalization :
http://ajax.asp.net/docs/mref/P_System_Web_UI_ScriptManager_EnableScriptGlobalization.aspx

Sobre como serialziar pelo lado Servidor:
http://ajax.asp.net/docs/mref/N_System_Web_Script_Serialization.aspx

Sobre como serialziar pelo lado Cliente:
http://ajax.asp.net/docs/ClientReference/Sys.Serialization/JavascriptSerializerClass/default.aspx

Um efeito e necessidade prática pode ser vista quando usamos o controle Calendar (presente no AJAXTOOLKIT) :
http://www.u2u.info/Blogs/Kevin/Lists/Posts/Post.aspx?List=6f246d9a%2De4e7%2D4846%2Db776%2Df9a62112ffb7&ID=6

E por fim outra explicação de um cara que sou Fã : o Dino Esposito
http://blogs.ugidotnet.org/dinoes/archive/2007/02/06/69915.aspx

Como pode ser observado os motivos de utilziação do  EnableScriptGlobalization são muto bem conhecidos, e sua compreenção é fundamental para que o desenvolvedor sabia quando e porque fazer uso deste recurso.

Considerações sobre Deployment

Desde a versão BETA2  houve mudanças significativas no core de Ajax que passou a fazer uso de reflexão. Devido a esta nescessidade a DLL precisa ter permissão  de FULL TRUST. Existem 2 formas que conheço e uma terceira que não tenho certeza de como implementar para termos esta permissão : 

a) Dar permissão FULL TRUST a aplicação do servidor web 
b) registrar a DLL no CAG do servidor que tem permissão FULL TRUST.

Por motivos de segurança a maioria dos servidores de hospedagem compartilhada rodam com permissão MEDIUM TRUST (Que não permitem por default as operações de reflexão) nas aplicações. 

A terceira opção (que não posso afirmar) é apenas dar permissão FULL TRUST para as operações de reflexão (vi isso em um grande host que roda em MEDIUM TRUST porem foi possível trabalhar com a versão BETA2 apenas colocando as DLL’s do AJAX na pasta bin, daí acredidar que isso seja possível... mas novamente posso estar enganado)

Abaixo alguns links interessantes para se aprofundar sobre Code Access Security in ASP.NET 2.0

http://msdn2.microsoft.com/en-us/library/ms998326.aspx
http://msdn2.microsoft.com/en-us/library/ms998341.aspx

Esta mudança não preciso dizer causou uma série de transtornos até a entrega da versão final, uma vez que a grande maioria dos hosts de hospedagem tem resistência de  registrar DLL no gac em versão beta ainda (eu particularmente senti  isso na pele ao ter que esperar a versão Final para publicar 100% de meu site dentro do meu Host). 

Com o lançamento da Versão final praticamente os problemas deixaram de existir e a grande maioria dos hosts sérios passaram a suportar o AJAX.NET registrando as DLLS no GAC e mantendo suas políticas de Code Access Security em MEDIUM TRUST.

Uma observação interessante é que esta forma de deployment sinaliza que provavelmente nas versões futuras do framework não será necessário baixar em separado as dlls do AJAX.NET  uma vez que será instalado junto com o framework e colocado as dlls no GAC (como deverá ser Tb a atualização dos validators controls já citados).

O que temos pela frente

O AJAX.NET com certeza é uma fantástica ferramenta para tornar nossas aplicações mais ricas , com maior usabilidade  e interatividade e são percebidas de imediato pelo usuário final.

Podemos esperar muito mais coisa pela frente.  Já estamos trabalhando com uma versão do AJAX TOOLKIT para o novo visual Studio codename: ORCAS, que vira com uma infinidade de recursos.

Alem do “Orcas” teremos também o WPF/E (ainda vou falar muito sobre ele) que vai elevar as experiência no uso de imagens e sons na web a níveis imagináveis.

Assisti uma demonstração que não é pública (infelizmente) que em dado momento não sabia mais se estava vendo uma aplicação sobre a web ou se a mesma estava rodando com o aero do Vista , algo realmente impressionante.

A esta altura você já deve estar se perguntando se o que estará fazendo com AJAX será perdido com a chegada do WPF/E.  O que posso dizer é que não será perdido, pelo contrario você estará mais familiarizado com uma nova forma  usabilidade proporcionada  hoje pelo AJAX e será muito mais fácil entender e aplicar o WPF/E, que não substitui o Ajax,  pelo contrário ira fazer bastante uso dos conceitos e de seus recursos.

Conclusão

Espero que com este post possa ter ajudado o leitor a entender melhor alguns dos conceitos novos que foram criados e implementados na versão final do AJAX.NET e o mais importante, não apenas saber dos do conceitos mas o porque de sua necessidade e/ou aplicabilidade.

Costumo finalizar minhas apresentações de AJAXcom uma frase :

“Um problema pode ser visto de vários ângulos. Descobrir novas visões do mesmo problema é a arte de saber encontrar a melhor solução.”

Tenha sempre isso em mente quando for aplicar Ajax em sistemas já existentes, lembre-se que toda as interfaces e a usabilidade foi pensada sem o uso de AJAX. Apenas aplicar updatepanels nas interfaces sem uma analise melhor de usabilidade pode resultar em uma interface mais “pobre” que a original. Todas as interfaces devem ser repensadas de forma a se tirar o máximo de proveito dos novos recursos com o mínimo de tráfego entre o cliente e o servidor.

A todos que chegaram ate aqui, uma ótima semana!

posted by FCerqueira | 55 Comments
Filed Under: , ,

Refletor 5.0 - Uma ferramenta indispensável

Uma ferramenta indispensável para o desenvolverdor é um aplicativo de reflexão.

Embora muitos achem que a intenção é descompilar e ver o código fonte, estas ferramentas tem uma tarefa mais nobre :  

Faciliar o entendimento do .NET framework.
Ajudar a melhorar a performance e reduzir os cast
Uma grande fonte de aprendizado

Já esta disponível uma destas ferramentas que gosto muito :

Lutz Roeder's Reflector 5.0

Uma coisa bem interesante é a  versão Add-Ins que esta hospedada no Codeplex!, e esta repleta de "features" muito legais , vale apena conferir. 

posted by FCerqueira | 1 Comments
Filed Under: ,

Grupo de Usuários Rio de Janeiro - Um Novo Grupo, Um grande trabalho

O grupo Code4All vem fazendo um grande trabalho  no Rio de Janeiro. É um grupo recente , porem seus integrantes já atuam na comundiade a bastante tempo , e recentemente fomos convidados a fazer parte . Temos muito orgulho em aceitar.

O grupo é o único no Rio de Janeiro a fazer seu trabalho de forma aberta, sem restrições a pessoas e idéais, apoia o programa MVP e Todos os MVP
'S  e deixa aberto para divulgação! Uma grande inciativa que não encontramos em outros grupos existentes aqui no RJ.

Estava faltando mesmo um grupo que não tivesse "censura" . Quem sai ganhando com isso é toda comunidade de desenvolvedores do Rio de Janeiro que poderão contar um um grupo aberto feito pela e para comunidade! Parabens!

Em entrevista com um de seus representantes  Ricardo Guerra  , descobrimos que esta previso muitas atividades muito em breve, é so aguardar! Ricardo resume o  grupo assim :

"O grupo Code4All tem trabalhado intensamente no Rio de Janeiro para promover a tecnologia .NET em todas as áreas!  Discutimos tecnologias recentes (Microsoft AJAX.NET, WPF, entre outras) e buscamos maior integração entre várias comunidades Microsoft do Rio de Janeiro e de todo país!  Junte-se a nós"

O que esta esperando para fazer parte ?

URL : http://www.code4all.net

 

AJAX : MARQUEE CONTROL e BALLOON TOOPTIP EXTENDER (COM VERSÃO FREE!)

Acabamos de publicar em nosso site (www.fci.com.br)  mais 2 controles com recursos de  AJAX 

Compatibilidade de Browser :



As imagens abaixo foram feitas usando o Opera! Big Smile [:D]

MARQUEE CONTROL Versão 1.0.0.0 Demo Professional
O controle Marquee possui a característica de fazer scrool do texto com a mesma funcionalidade da TAG "marquee" e adicionada várias funcionaldiades extras.

BALLOON TOOPTIP EXTENDER Versão 1.0.0.0 Demo Professional
O controle Balloon Tooltip apresenta um tooltip na forma de balão, com opções de Scroll tipo "Marquee", Eventos pelo mouse-hover e onclick , permite a abertura de outras páginas entre outras funcionalidades 

Ambos os controles tem uma versão FREE para COMUNIDADE.


Aguardamos sua visita e comentários!

Grande Abraço

Fernando Cerqueira

posted by FCerqueira | 0 Comments
Filed Under: , ,

Novo Site no AR! 100% AJAX

Estavamos aguardando o lançamento oficial do AJAX.ASP.NET 1.0  para publicar o


Agora a comunidade poderá  baixar novos controles , ler artigos de uma forma bem mais organzida. Esperamos sua visita e comentários!




Microsoft lança oficialmente o AJAX 1.0

Acaba de ser lançado hoje, 23/01/2007 a versão oficial e final do AJAX.ASP.NET 1.0. Juntamete com o a versão oficial esta sendo lançado + 4 controles no  AJAXTOOLKIT :<ajaxToolkit:CalendarExtender>, <ajaxToolkit:MaskedEditExtender> feito por nós , <ajaxToolkit:TabContainer> e <ajaxToolkit:AutoCompleteExtender>. 



 




MaskedEdit em Ação

posted by FCerqueira | 0 Comments
Filed Under: ,

AJAX RELEASE CANDIDATE + OUTRO RELEASE DO TOOLKIT PROGRAMADO!

Recebemos hoje a notificação que esta sendo publicado no site o

RELEASE CANDIDATE DO AJAX.

Juntamente com ele como é de costume vem também um novo release do AJAXTOOLKIT já funcionando no RC.

Passei agora no site E já esta como download público.
(http ://ajax.asp.net)

A nova versão do Toolkit teve como foco resolver uma série de bug's dos controles e várias melhorias em quase todos os controles.

Um novo release ainda vair!....hehehehe,
Ainda este mês de dezembro deverá sair um RELEASE DO TOOLKIT
com pelo menos + 4 controles 

MASKEDEDIT, TABCONTROL, DATEPICK , CALENDAR

Aguardem mais novidades em breve !


posted by FCerqueira | 0 Comments

BETA2 DO ASP.NET AJAX

Desta vez foi muito curto o intervalo entre os releases :-)

Ontem  foi liberado o BETA2 DO ASP.NET AJAX e tb um update do ToolKit para este release!. 

Veja os Detalhes no site oficial em :
http://ajax.asp.net

Como o intervalo foi bem curto não tive tempo de postar as alterações que foram muitas , entre o "ATLAS" -> AJAX ASP.NET.

Agora, com a proximidade do TechEd2006 
http://www.teched.com.br/ ( 28 a 30/11) estaremos revisando nossa palestra . Quem estiver presente vale apena agendar para assitir a apresentação, Estaremos mostrando em  detalhes este Framework :

WEB307 - Mergulhando a Fundo no ASP.NET AJAX
 

Grande abraços a todos e até o Teched!

Fernando Cerqueira

Atlas TOOLTIP Extender - Novo Controle!

Submetemos hoje um novo para integrar o AtlasToolkit : 

Tooltip Extender :

O webcontrol Tooltip serve para você prover uma apresentação de dicas e/ou help estático ou dinâmico para sua aplicação. O título (opcional) e o texto podem ser carregados do servidor durante a inicialização ou durante o eveto do mouse usando web-service ou page method. Recursos de temporização, cores e velocidade dos textos foram incluídos.

Uma demostração de seu funcionamento pode ser visto no link abaixo :

Clique aqui para ver a demostração e escolha a opção a esquerda ToolTip

Bom início de semana a todos.

Fernando Cerqueira
Atlas: Your code. Our passion.

 

posted by FCerqueira | 0 Comments
Filed Under: ,

Ajax - Imagens Animadas

Quando estamos utilizando AJAX normalmente precisamos de imagens animadas para dar uma aparência mais profissional para nossa aplicação enquanto é executado o processo no servidor.

Para facilitar a escolha destas imagens já existe alguns site bem interessantes....

Um bem simpático que permite você escolher cores e formatos esta em :

http://www.ajaxload.info/  vale Apena dar um conferida.

Se você deseja algo pronto pode dar uma olhada também em :

http://www.napyfab.com/ajax-indicators/  e escolher sua Imagem.

Grande Abraço
Fernando Cerqueira




 

posted by FCerqueira | 0 Comments
Filed Under: ,

Atlas ToolKits - New Release 14/09

Nesta segunda foi publicado um novo release do Atlas Toolkit.

Nesta versão Release 60914 Production  temos 3 novos controles que passaram para produção :

Animation - Um Extender super completo controle para dar poder de animação e efeitos . A lista de possíveis efeitos é enorme e mereceu uma documentação completa e Walkthroughs.

NoBot -  Um controle do tipo captacha Like, ele evita que sucessivos post-backs sejam processados sem que seja avisado de uma possível intenção de ataque por robot.

Slider -  Um simpático controle deliszante de graduação para as mais diversas utilidades.


A nossa equipe esta trabalhando firme para ter novos controles!, Foi feito uma reestruturação da arvore de pastas do projeto, tornando mais fácil o controle da qualidade e testes dos novos controles.

Uma coisa legal é que usamos o Team System para tudo , sendo uma demonstração clara de como podemos ter equipes distribuídas por todo o mundo e os coordenadores estarem controlando e sabendo de tudo que esta acontecendo no projeto!

A versão de 14/09 Release 60914 Production pode ser baixada em :

http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=AtlasControlToolkit

Uma boa semana a todos,

Fernando Cerqueira

Atlas: Your code. Our passion.

 

posted by FCerqueira | 0 Comments
Filed Under: ,
More Posts Next page »