Apaixonado por tecnologia. Trabalho com tecnologia desde 2003.

Saiba mais sobre minha vida profissional aqui .

Fale comigo.
Siga-me no Twitter
Ultimos comentários
Calendário de Posts
<<  julho 2017  >>
stqqssd
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

Siga o @DicaDoNerd no Twitter e acompanhe as novidades


Um constante problema ao utilizar algum script de qualquer Framework (Jquery, ExtJs) e colocarmos dentro de um UpdatePanel do ASP.NET o script simplesmente para de funcionar. Isso acontece pelo fato de como uma transação assíncrona ocorrida dentro do UpdatePanel transita apenas o pedaço de código para o servidor.

Existe uma forma bem simples de resolver este problema. Toda vez que é feita uma requisição o Script Mananger controla eventos como Inicio da Requisição (beginRequest), Carregamento do Página (PageLoad) e finalização da requisição (endRequest).

Basta “chamar” o script novamente que o problema estará resolvido. Isso acontece também, quando utilizado apenas um ScriptMananger na Master Page, você pode escolher se deseja controlar a requisição na Master Page ou se deseja controlar em Páginas (ASPX) separadamente.

Vamos lá!

<script>
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(registraScript);

function registraScript(sender, args) {
//Execute aqui seu script.
}


</script>


Resolvi escrever este post, pois, no analytics notei que muitas pessoas que chegam até o meu blog, estão com perguntas como: Update Panel + Jquery ou MasterPage Jquery…. estas são as campeãs de solicitação.

 

Não encontrou o que procurava?  Entre em contato. ;-)

Minato , Criado em 28/05/2011, 17:33

Enviar email por aplicações é bastante eficaz, assim, utilizando a classe MailMessage() podemos fazer isso, vamos ver como funciona?

Não tem qualquer segredo, basta no web.config colocar as chaves:

Email.FROM = seuemail@seuemail.com.br (que será exibido para o destinatário.

Email.SMTP = geralmente: smtp.seudominio.com.br

Email.NetworkCredential.User = Usuário (seu email)

Email.NetworkCredential.PWS = Senha.

public class Email : IDisposable
{
private readonly string Remetente = ConfigurationManager.AppSettings["Email.FROM"];
private readonly string SMTP = ConfigurationManager.AppSettings["Email.SMTP"];
private readonly string Usuario = ConfigurationManager.AppSettings["Email.NetworkCredential.User"];
private readonly string Senha = ConfigurationManager.AppSettings["Email.NetworkCredential.PWS"];

public void EnviarEmail(string Assunto, string Html, string EmailDestinatario)
{

//Cria novo objeto MailMessage
MailMessage mailMessage = new MailMessage();

//Define o remetente
mailMessage.From = new MailAddress(Remetente);

//Define primeiro destinatário
mailMessage.To.Add(EmailDestinatario);

//Define segundo destinatário, note que podemos adicionar infinitos destinatários
//mailMessage.To.Add("E-MAIL DO DESTINATÁRIO");

//Define assunto do e-mail
mailMessage.Subject = Assunto;

//Seta propriedade para enviar email em html como true(verdadeiro)
mailMessage.IsBodyHtml = true;

//Seta o corpo do e-mail com a estrutura HTML gravada na stringbuilder sbBody
mailMessage.Body = Html;

//Cria novo SmtpCliente e seta o endereço
SmtpClient smtpClient = new SmtpClient(SMTP);

//Credencial para envio por SMTP Seguro (APENAS QUANDO O SERVIDOR EXIGE AUTENTICAÇÃO)
smtpClient.Credentials = new NetworkCredential(Usuario, Senha);

// Envia a mensagem
smtpClient.Send(mailMessage);

}


#region IDisposable Members

public void Dispose()
{
GC.SuppressFinalize(this);
}

#endregion
}

Para usar:

using(Email email = new Email())
{
email.EnviarEmail("Assunto", "<strong> Olá </strong>", "contato@alexandreminato.com.br");
}

Pronto.

Você gostaria de algum artigo em especial? Entre em contato no formulário ou envie email para contato@alexandreminato.com.br

Até a próxima

Normalmente sou desconfiado de soluções de auto-complete. Vou realizar um próximo post, que mostra como fazer a mesma coisa utilizando JQuery. Porém a solução do Jquery exige que você coloque todas as informações da consulta no formato Json no momento em que carrega a página, isso pode ser eficiente para poucos registros, para grande quantidades de registros, acredito que o Auto Complete do Ajax Control Toolkit seja mais indicado.

image
Imagem 1

Vou utilizar Linq To Sql para a implementação deste exemplo, pois acredito que é um dos frameworks que trazem maior produtividade em desenvolvimento. Estou utilizando dados e exemplos de um projeto real que está em produção, por isso, os nomes não sejam conhecidos como o Northwind ou Pubs.

Bom, vamos primeiro entender a estrutura.

Criei uma entidade (utilizando o LinToSql). (Imagem 1), assim, teremos acesso aos dados e podemos criar os métodos para acessos aos dados utilizando o mapeamento relacional gerado automaticamente.

Vamos agora criar o método que será utilizado pelo webservice que é necessário para utilização do auto-complete.

using System;
using System.Linq;

namespace PitStop.Dados
{
public class CadastroCliente : IDisposable
{
//Crio a variavel que irá conter o contexto dos Dados.
private dbDataContext dbContext;

/// <summary>
/// Construtor da classe.
/// </summary>
public CadastroCliente()
{
//No construtor, crio a instancia do contexto.
dbContext = new dbDataContext();
}

/// <summary>
/// Retorna clientes que possam atender a consulta
/// </summary>
/// <param name="textoBuscar">Parte do nome do cliente</param>
/// <param name="count">Quantidade de itens que serão retornados</param>
/// <returns>array com nome dos clientes</returns>
public string[] RetornarNomesClientes(string textoBuscar, int count)
{
//Aqui é um pulo do gato, como vamos apenas fazer a consulta, desabilitamos o tracking que por padrão fica habilitado.
//Funciona apenas para consulta, qualquer ação que necessite que o estado seja salvo (Update, Insert, Delete) é necessário habilitar.
dbContext.ObjectTrackingEnabled = false;

return dbContext.ClienteEntidades
.Where(p => p.Inativo == false && p.Nome.ToLower().Contains(textoBuscar)) // Filtro clientes ativos e que contenham o texto.
.Select(m => m.Nome) // não há necessidade da entidade inteira, então, retorno apenas o nome
.Take(count) // retorno apenas a quantidade quantidade necessária
.ToArray(); // Converto o resultado para um array.
}


// Fecho o que pode estar aberto.
#region IDisposable Members

~CadastroCliente()
{
this.Dispose();
}

public void Dispose()
{
GC.Collect();
GC.SuppressFinalize(this);
}

#endregion
}
}

Agora, vamos criar o WebService que será chamado pelo componente do AutoCompleteExtender. Clique com o Botão direito e selecione o item “WebService”.

image

Ao adicionar o WebService, vamos criar o método responsável por invocar o método que criamos nos passos anteriores.

using System.Web.Services;
using PitStop.Dados;

namespace PitStop.Web.webService
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class AutoComplete : System.Web.Services.WebService
{
public AutoComplete()
{
}

/// <summary>
/// Retorna dados para o autoComplete
/// </summary>
/// <param name="prefixtext">Texto que será pesquisado</param>
/// <param name="count">Quantidade de registros que serão retornados</param>
/// <returns>array com nome dos clientes</returns>
[WebMethod]
public string[]RetornarClientes(string prefixtext, int count)
{
using (CadastroCliente cad = new CadastroCliente())
{
return cad.RetornarNomesClientes(prefixtext, count);
}

}
}

}

Pronto, estrutura pronta agora vamos preparar a interface, que consumirá a informação

Em uma nova página aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TesteComplete.aspx.cs" Inherits="PitStop.Web.TesteComplete" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Teste Auto Complete</title>
<style type="text/css">
.autocomplete_list {visibility:visible;margin:0px!important;padding:1px;background-color:GrayText;color:Black;
border:buttonshadow;border-width:1px;border-style:solid;cursor:default;text-align:left;list-style-type:none;
font-weight:normal;font-family:Verdana;font-size:10px;}
.autocomplete_highlighted_listitem {background-color: GrayText;color:Black;padding:3px;}
.autocomplete_listitem {background-color:Window;color:Gray;font-family: Verdana;font-size: 10px;padding:3px;}

</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ToolkitScriptManager ID="sm" runat="server" />
<asp:AutoCompleteExtender ID="ace" runat="server"
EnableCaching="true"
MinimumPrefixLength="1"
TargetControlID="txtNome"
ServicePath="~/webService/AutoComplete.asmx"
ServiceMethod="RetornarClientes"
CompletionInterval="10"
CompletionSetCount="10"
CompletionListCssClass="autocomplete_list"
CompletionListItemCssClass="autocomplete_listitem"
CompletionListHighlightedItemCssClass="autocomplete_highlighted_listitem">

</asp:AutoCompleteExtender>
<asp:TextBox ID="txtNome" runat="server" CssClass="campoForm" Width="400px" autocomplete="off" />

</div>
</form>
</body>
</html>

Vale algumas dicas:

CompletionSetCount = 10 –> Indica a quantidade de registros que serão exibidos na lista do auto-complete.

EnableCaching = true –> Guarda as ultimas consultas realizadas.

MinimumPrefixLength = 1 –> Indica a partir de quantos caracteres digitados será realizado o auto-complete (o ideal seria 3 a 5)

CompletionListCssClass, CompletionListItemCssClass e CompletionListHighlightedItemCssClass você consegue alterar o estilo (css) do auto-complete.

Uma coisa legal é autocomplete="off" que utilizei no TextBox (txtNome) isso indica que não será utilizado o autocomplete do browser, pois, isso pode confundir o usuário.

Vamos ver o resultado?

image

Espero que tenham gostado... Dúvidas ou sugestões de artigos entrem em contato ;-).

Até a próxima.

 
teste