FileUpload com AJAX

Texto extraído do pélessê.

Esse é um problema comum, o objeto FileUpload precisa de um ciclo completo de postback para receber um upload. Já o AJAX veio justamente para suprimir esses postbacks.
Então, quando temos um asp:FileUpload dentro de um asp:UpdatePanel, esses postbacks não ocorrem e quando consultamos a propriedade HasFile do FileUpload não recebemos nada.
No entanto, podemos contornar isso facilemente através de triggers do UpdatePanel.

<asp:UpdatePanel runat=”server” UpdateMode=”Conditional” >
<ContentTemplate>
<asp:FileUpload runat=”server” />
<asp:Button runat=”server” ID=”MeuBotao” />
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID=”MeuBotao” />
</Triggers>
</asp:UpdatePanel>

No exemplo acima, definimos que o botão que faz o submit deve acionar o postback, e isso faz a mágica.

Posted in Artigos. Tags: , . Nenhum Comentário »

[DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied.

Texto extraído do pélessê.

Já me ocorreu algumas vezes de, ao tentar estabelecer uma conexão contra a base de dados, receber esse retorno. Eu checo e re-checo a connection string e tudo parece estar correto. No Firewall a porta 1433 está devidamente liberada. Nas configurações do SQL Server, os protocolos para a rede, habilitados. Tudo certinho.

Hoje me ocorreu um caso ainda mais inusitado. Criei duas conexões contra a mesma base SQL Server 2005. Uma usando o provedor SqlClient e a outra usando o OleDb. Mesmo usuário, mesmo senha, mesmo tudo. A que usava o SqlClient foi, a OleDb não. Fiquei cabrero.

Depois de um pouco apanhar, resolvi tentar o DNS ou IP para me referenciar ao servidor. Já que a conexão estava sendo feita para um SQL Server instalado na própria máquina, havia tomado a liberdade de usar a constante (local) como nome de servidor.

Buzz’s Eye… Na mosca… Foi só usar o DNS (ou IP) da máquina no lugar de usar a constante que o OleDb se localizou.

The Controls Collection Cannot be Modified Because the Control Contains Code Blocks

Texto extraído do pélessê.

Usando MasterPages no AspNet voce pode cair nesse problema ao usar CodeBlocks no Header. Vejamos o seguinte cenário:

<head runat=”server” >
<title>webCash</title>
<link rel=”stylesheet” type=”text/css” href=”/App_Themes/Default/Master.css” />
<link rel=”shortcut icon” href=”/favicon.ico”/>
</head>

Ficamos limitados quanto ao local onde se encontrará o favicon dependendo de como a aplicação fora hospedada. O que queremos é que o ícone seja lido da raiz da aplicação indiferente de como foi feita a hospedagem. Normalmente resolveríamos isso com Code Blocks, como abaixo:

<head runat=”server” >
<title>webCash</title>
<link rel=”stylesheet” type=”text/css” href=”/App_Themes/Default/Master.css” />
<link rel=”shortcut icon” href=”<%= ResolveUrl(“~/favicon.ico”)%> “/>
</head>

Porém essa sintaxe causa o erro citado no título desse post. O que podemos fazer ? Utilizar DataBind no lugar dos Code Blocks. No Head, a sintaxe é quase igual, mudando apenas o sinal = para #, como abaixo:

<head runat=”server” >
<title>webCash</title>
<link rel=”stylesheet” type=”text/css” href=”/App_Themes/Default/Master.css” />
<link rel=”shortcut icon” href=”<%# ResolveUrl(“~/favicon.ico”)%> “/>
</head>

E, no Page_Load do MasterPage, dispararemos o devido bind:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
If Not Me.IsPostBack Then
Page.Header.DataBind()
End If
End Sub

Em linhas gerais, é isso.
Agarceço ao seguinte post por essa ideia:

Posted in Artigos. Tags: . Nenhum Comentário »

Async em AspNet com AJAX

Texto extraído do pélessê.

Hoje duelei por um tempo com as chamadas assíncronas numa página ASP e por isso, vou postar aqui a solução para poder me lembrar caso precise.

Quadro muito comum: Criei uma classe que era instanciada e tinha um método chamado. Após isso, internamente, os processos eram executados em diversas threads para agilizar e, ao concluir tudo, um evento disparado. Se fosse windows application seria “mamão com açucar”, mas numa web aplication… temos o fator timeout da mesma.

A primeira coisa a se fazer é acrescentar na declaração da página a propriedade Async, isso definirá que a mesma pode tratar as chamadas assíncronas. Quanto ao timeout, o default é 90 segundos… se voce, como eu, tiver um processo realmente demorado e precisar aumentar isso, fazemos através da propriedade AsyncTimeout, lembrando que a unidade é segundos.

<%@ Page Async=”true” AsyncTimeout=”300″ %>

Mas isso não basta, se sua aplicação usar AJAX… Nesse caso entra o fator ScriptManager que também possui uma propriedade para indicar o timeout.

<asp:ScriptManager runat=”server” AsyncPostBackTimeout=”300″ />

E agora vai que é uma beleza.

Posted in Artigos. Tags: , . Nenhum Comentário »

AutoCompleteExtender não dispara eventos, não responde

Pela segunda vez ao começar um novo projeto AspNet usando o extender AutoCompleteExtender para auto-sugerir valores num dropdown conforme se digita num textbox, eu tenho dificuldades em fazer o recurso funcionar.

Faço todas as chamadas, crio o webService, testo o webService, tudo OK mas,.. simplesmente na página ao digitar nada é sugerido.

Após apanhar muiiiiito, comparando minhas outras aplicações (onde o recurso está funcionando) com a nova, identifiquei sutis diferenças nas declarações dos webMethods e dos webServices e… sim eram esses os problemas. Para que eu não volte a esquecer, vou documentar aqui

Declaração do webService:

<WebService(Namespace:=“http://tempuri.org/”)> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ <Script.Services.ScriptService()> _
Public Class
AutoComplete
Inherits
System.Web.Services.WebService

Declaração do webMethod (declaração é totalmente case-sensitive):

<WebMethod()> _
<Script.Services.ScriptMethod()> _

Public Function
GetTerceiros( _
ByVal
prefixText As String, _
ByVal
count As Integer) As String()

Chamada no AspX:

<ajaxToolkit:AutoCompleteExtender
ID
=”TerceiroAutoComplete”
runat
=”server”
TargetControlID
=”TerceiroTextbox”
ServicePath
=”~/Common/AutoComplete.asmx”
ServiceMethod
=”GetTerceiros”
MinimumPrefixLength
=”1″
CompletionInterval
=”1000″
CompletionSetCount
=”20″
EnableCaching
=”true”
Enabled
=”true”
/>

Ah sim, mais uma coisa, no AspX os objetos devem estar dentro de um UpdatePanel, naturalmente.

Posted in Artigos. Tags: , . Nenhum Comentário »