quarta-feira, 25 de março de 2009

Criando um Formulário em Ajax de Login com jQuery

Artigo original escrito por Justin

Neste artigo eu quero mostrar como usar o jQuery para crirar uma tela de login com AJAX. Eu vou utilizar uma aplicação ASP.NET MVC para esta demonstração. Vou estar modificando a pequena aplicação padrão que é criada quando abrimos uma nova aplicação MVC. Então vamos em frente e crie uma aplicação MVC. Eu vou explicar o passo a passo, então quando este artigo estiver pronto, você terá uma aplicação em funcionamento.

create-mvc-app

Passo 1

Abra o LogOnUserControl.ascx. Ele está em /Views/Shared/. O que queremos é modificar o link para incluir um atributo onclick que irá disparar o a função login() e associar um id ao link. O código deve se parecer com este:

   1: <%= Html.ActionLink("Log On", "LogOn", "Account", null,


   2: new { onclick = "return login();", id = "login_link" })%>


Passo 2

Abra a página Site.Master, também localizada em /Views/Shared/, inclua os links para o stylesheet, o jQuery e o JavaScript na ssão head do documento.


   1: <link type="text/css" rel="stylesheet" href="../../Content/login.css" />


   2: <script type="text/javascript" src="../../Scripts/jquery-1.2.6.min.js"></script>


   3: <script type="text/javascript" src="../../Scripts/login.js"></script>


Vamos em frente e criar um arquivo chamado login.css em /Content/ e um login.js em /Scripts/. Deixe eles vazios por enquanto.

Passo 3

Ainda na Site.Master, insira o seguinte código no final da página, logo antes de fechar a tag body. Este é o nosso formulário de login que iremos usar. O código contem uma div com o id lightbox que irá cobrir a tela para causar a impressão de que nosso login é modal. O lightbox criará um fundo preto transparente.

Adicionalmente aos elementos input do formulário existe também uma div chamada message que servirá como uma área para as mensagens de retorno ao usuário.

<div id="lightbox"></div>
<div id="login_outer_container">
<div id="login_form">
<div id="message"></div>
<fieldset>
<legend>Login Information</legend>
<p>
<label for="username">Username:</label>
<%
   = Html.TextBox("username")

%>

<%


   = Html.ValidationMessage("username")

%>

</p>

<p>

<label for=”password”>Password:</label>

<%


   = Html.Password("password")

%>

<%


   = Html.ValidationMessage("password")

%>

</p>

<p>

<%


   = Html.CheckBox("rememberMe")

%> <label class=”inline” for=”rememberMe”>Remember me?</label>

</p>

<p>

<input type=”button” value=”Log On” onclick=”submitForm();” />

<input type=”button” value=”Cancel” onclick=”cancelLogin();” />

</p>

</fieldset>

</div>

</div>


Passo 4


Insira o seguinte código ao login.css. Este será o estilo para os elementos do nosso formulário.


   1: #lightbox {


   2: position: absolute;


   3: top: 0;


   4: left: 0;


   5: width: 100%;


   6: background: black;


   7: filter: alpha(opacity=60);


   8: opacity: 0.6;


   9: display: none;


  10: }


  11: 


  12: #login_outer_container {


  13: position: absolute;


  14: top: 50%;


  15: left: 50%;


  16: }


  17: 


  18: #login_form {


  19: position: relative;


  20: top: -125px;


  21: left: -200px;


  22: width: 400px;


  23: height: 250px;


  24: display: none;


  25: background: white;


  26: padding: 10px;


  27: border: 1px solid #424242;


  28: }


  29: #message {


  30: display: none;


  31: border: 1px solid #b8b8b8;


  32: background: #f6f3f6;


  33: padding: 5px;


  34: color: Red;


  35: }


  36: 


Passo 5

Agora é onde a mágica realmente acontece. Vamos inserir código ao login.js. Eu vou explicar lentamente o que cada função está fazendo e porque isso interessa para a nossa aplicação.

A primeira função que vamos criar é a login() que mencionamos mais ceso. Nesta função nós vamos pegar o elemento lightbox e associar a ele algumas propriedados de estilo. Note que nós estamos atribuindo um atributo filter da mesma forma que fizemos no login.css. Por algum motivo o IE perde este atributo e temos que colocar novamente. Nós também estamos dizendo ao lightbox para aparecer lentamente.

Depois nós pegamos o elemento principal do form e mandamos também aparece lentamente.

No final, nós retornamos false para prevenir que o link nos mande para o seu href. Nós não queremos que a página recarregue.


   1: function login() {


   2: $('#lightbox')


   3: .css({


   4: 'height': $(document).height(),


   5: //reset opacity because IE loses it on open 


   6: 'filter': 'alpha(opacity=60)'


   7: })


   8: .fadeIn('slow');


   9: $('#login_form').fadeIn('slow');


  10: return false;


  11: }


Agora quando um usuário clica no link [ Log On ] um impressionante forumlário de login irá aparecer bem no centro da tela.

Note como nós definimos a altura do lightbox para a altura atual do documento. Se o usuário redimencionar a janela do navegador isso irá fazer com que o lightbox fique muito grande e aparecerá barras de rolagem ou com que fique muito pequeno também, tudo dependendo de como a tela será redimencionada. Para corrigir este problema nós vamos criar uma função que irá definir a altura do lightbox para a altura atual do documento e definir um evento que irá disparar nossa função sempre que a janela seja redimencionada.


   1: function adjustLightbox() {


   2: $('#lightbox').css({ 'height': $(document).height() });


   3: };


   4: 


   5: var resizeTimer = null;


   6: $(window).bind('resize', function() {


   7: if (resizeTimer) clearTimeout(resizeTimer);


   8: resizeTimer = setTimeout(adjustLightbox, 100);


   9: });


  10: 


Quando nós criamos o código do nosso formulário de login, adicionamos um botão que chamava a função cancelLogin() no evento onclick. Se o usuário clicar neste botão nós queremos cancelar o login, limpar o formulário e voltar para a tela principal. Vamos criar esta função.

Primeiro esta função irá dizer ao lightbox e ao formulário principal para lentamente desaparacer e voltar a tela principal.

Depois nós limpamos os valores de todos os elementos input que não são botões e nos certificamos de que o checkbox remember me não está marcado.

Ao final, nós limpamos o elemento de mensagem e escondemos ele também.


   1: function cancelLogin() {


   2: $('#lightbox').fadeOut('slow');


   3: $('#login_form').fadeOut('slow');


   4: $('#login_form input[type!=button]').val('');


   5: $('#login_form input[type=checkbox]').each(function(i) {


   6: this.checked = false;


   7: });


   8: $('#message').html('').css({ 'display' : 'none' });


   9: }


Isto nos leva a nossa última função que irá submeter o formulário quando o usuário clicar em submit. Primeiro criamos a função submitForm. Esta função está associada ao evento onclick do botão submit em nosso HTML.


   1: function submitForm() {


   2: 


   3: }


   4: 


A primeira coisa que queremos fazer é pegar os valores do formulário, username, password e remember me.


   1: var username = $('#username').value;


   2: var password = $('#password').value;


   3: var rememberMe = $('#rememberMe').checked ? 'true' : 'false';



Neste ponto você pode fazer qualquer tipo de validação nestes valores. Eu não vou incluir nenhuma validação nesta demonstração.

Agora iremos criar uma string com os dados dos três valores.


   1: var dataString = 'username=' + username + '&password=' + password + '&rememberMe='


   2:  + rememberMe;


Finalmente nós iremos configurar a chamada AJAX ao servidor para autenticar o usuário. Nós usaremos a string com os dados que acabamos de criar para passar ao nosso request. Nós temos que configurar também as chamadas de retorno em caso de sucesso ou falha.

Se a chamada foi bem sucedida, chamaremos a função cancelLogin() para fechar o formulário e mudar o link Log On para mostrar Log Off.

Se a chamada falhar, mostraremos uma mensagem de erro ao usuário.


   1: $.ajax({


   2: type: 'POST',


   3: url: '/Account/LogOn',


   4: data: dataString,


   5: success: function() {


   6: cancelLogin();


   7: $('#login_link').html('Log Off').href = '/Account/LogOff';


   8: },


   9: error: function() {


  10: $('#message').html('Failed to login')


  11: .css({ 'display': 'block' });


  12: }


  13: });


Com isso nós terminamos a aplicação. Você deve ter agora um formulário de login funcional.

Nenhum comentário:

Postar um comentário