Na dúvida entre WebForms e MVC?

Com o ASP.NET MVC 2 e o Visual Studio 2010 temos uma grande sacudida no desenvolvimento para a web. Agora nós temos duas formas bem distintas de resolver o mesmo problema:

  • Podemos criar nossas aplicações da forma tradicional usando WebForms
  • Ou criar aplicações usando o design pattern MVC

Há grandes diferenças nas duas tecnologias. Vamos analisar uma a uma.

ASP.NET WebForms

  • Modelo de programação baseado em controles e eventos: a principal característica é a semelhança com aplicações desenvolvidas para Windows. Basicamente se você tem já desenvolveu em Delphi, VB6 ou .NET para Windows você tem grandes chances de se sentir familiar com a forma como tudo se relaciona no ASP.NET. Uma outra caracterísitca é se você não está disposto a aprender algo novo, WebForms te cairá bem.
  • Controles encapsulam HTML, JS e CSS: as dezenas de controles encapsulam o Html, Javascript e CSS. Você simplesmente adiciona o controle no formulário e ao executar tudo será gerado pra você.
  • Ricos controles de interface de usuário: ASP.NET separou o código de apresentação do código de comportamento da página, foi uma grande mudança em relação ao ASP clássico. E com isso trouxe uma dependência: se existe um controle na tela com um comportamento mais rico geralmente teremos métodos no servidor para dar suporte a esse comportamento.
  • Diferenças do navegador capturadas pra você: Alguns controles mais complexos do ASP.NET escrevem HTML+CSS+JS de acordo com o tipo de navegador que fez a requisição.
  • Desenvolver para SharePoint só em WebForms: Se você usa SharePoint você terá que usar WebForms.

ASP.NET MVC

  • É mais confortável para os desenvolvedores web: enquanto WebForms veio para ajudar a migrar os desenvolvedores Windows para a Web, ASP.NET MVC veio para ajudar os desenvolvedores web a desenvolverem aplicativos de forma mais natural.
  • Controle total do HTML: com MVC você passa a ter total controle sobre o que é gerado (HTML, CSS, JS). Em contrapartida você tem a sensação de trabalhar mais para fazer o mesmo.
  • Permite teste unitário: ASP.NET MVC te permite facilmente implementar teste unitário, e claro se você tem boas ferramentas para testar o seu código você terá um código melhor. Já em WebForms não há nada que se compare com os teste que MVC permite.
  • Força o desenvolvimento padronizado: com MVC você desenvolve de uma única maneira, e todo seu aplicativo é assim. Enquanto que em ASP.NET você desenvolve tentando manter tudo funcionando a medida que novos recursos são adicionados.
  • Extremamente flexível e extensível: Você acrescenta recursos na sua aplicação de forma desacoplada e pensa no workflow enquanto que em WebForms você desenvolve tentando juntar as peças.

Se você achou interessante, veja o video que o Scott Hanselman colocou no ASP.NET MVC com esse tema, vale a pena. Ou então dê uma passada no blog Code Better.

Postado em @ 3/12/2010 1:55 PM por Ivan Paulovich

Versão final do ASP.NET MVC 2 é liberada

Temos agora a versão final do ASP.NET MVC 2 disponível para download, você tem duas opções para baixar essa nova versão:

O ASP.NET MVC 2 traz novos recursos para o lado cliente, você pode ver mais detalhes nos blogs:

Pra quem tem curiosidade pode conferir o código fonte no CodePlex e também pode acompanhar alguns artigos sobre o que mudou ou dar uma lida no post do Luciano sobre MVC.

Postado em @ 3/12/2010 8:37 AM por Ivan Paulovich

Team Foundation Server Power Tools

Hoje vou dar uma dica para quem usa o TFS mas nem sempre está usando a interface do Visual Studio (mais precisamente do Team Explorer). Estive trabalhando recentemente num projeto web que foi feito em .Net e Flex. Enquanto eu estava trabalhando nos serviços e regras de negócio dentro do Visual Studio eu podia facilmente dar check-out e check-in nos arquivos e manter meu projeto sincronizado com o restante da equipe. Porém, quando estava no Flex Builder (IDE do Flex) a situação era bem menos confortável. Isso por que, eu precisava ficar com o Visual Studio aberto para ver o Team Explorer e dar check-in nos arquivos que estava produzindo no Flex. É claro que num determinado momento isso me irritou profundamente, já que apesar do TFS ser um maravilhoso sistema de versionamento de arquivos, faltava uma integração direta com o meu Windows Explorer (assim como no SVN)...

Minha falha foi não ter pesquisado direito, mas com um pouco de google encontrei o Team Foundation Server Power Tools. Basicamente, o TFSPT é um pacote de “add-ons”. Vou mostrar para vocês um destes "add-ons" que resolve exatamente o problema de integração direta com o Windows Explorer, garantindo assim que você consiga versionar arquivos sem precisar do Visual Studio aberto só para fazer isso.

Primeiramente baixe o TFSPT. Download da versão 2008, mas já existe um Beta disponível para a versão 2010. Se você quizer testar, pode fazê-lo clicando aqui. Depois de baixar mande instalar, só fique atento para ver se o Windows Shell Extension será incluído na sua instalação.


Depois de instalar, você pode acessar o Windows Explorer e procurar uma pasta qualquer que esteja vinculada a um Workspace do TFS. Clicanco com o botão direito do mouse nestas pastas, você verá um menu como este:


Muito prático! No melhor estilo SVN. Esse tipo de recurso é muito útil quando estamos trabalhando por exemplo num processo de documentação, gerando vários arquivos binários do Visio, Word, Imagens, etc... arquivos que não geramos no Visual Studio.

Grande abraço a todos,
e até a próxima.

Postado em @ 3/11/2010 10:55 PM por André Paulovich

Asp .Net MVC

Grande galera do 100loop, como vão? Ivan, gostei do novo layout, agora sim ficou show de bola heim!!.

Bem, vamos dar início a uma série de posts falando sobre o novo Framework 4.0, sobre o C# 4.0, WCF 4.0, sobre o Asp Net 4.0 e muitas outras coisas.

Pois bem, iniciaremos falando um pouco sobre o Asp .Net MVC 2.0.

Mas o que é Asp .Net MVC?

A sigla MVC, que quer dizer "Model-View-Controller " é um padrão de arquitetura de software, sendo considerado um Design Pattern.

Basicamente o modelo se divide em: dados (Model) , layout (View)  e a lógica (Controller).

Desta forma, alterações feitas no layout não afetam a manipulação de dados, e estes poderão ser reorganizados sem alterar o layout, sendo assim, o MVC resolve o problema da separação das tarefas de acesso aos dados e lógica de negócio, lógica de apresentação e de interação com o utilizador.

Bem, vocês podem estar se perguntando, trabalho a tanto tempo com o Web Forms e agora a Microsoft cria mais uma forma de desenvolvermos para Web, bem isso quer dizer que o Web Forms vai acabar?

A resposta é não, o web forms não vai acabar.

Então qual devo utilizar para criar meus projetos web?

A escolha de qual tipo de projeto você deve criar, deve ter como base que tipo de projeto pretende criar, qual será a complexibilidade dele, flexibilidade dentre muitas outras questões. Basicamente podemos definir que Web Forms seria para projetos mais simples, rápidos de serem implementados.

Já o MVC seria aplicado em projetos mais arrojados, com maior complexidade, um maior grau de detalhes em matéria de design e controle dos componentes.

Para quem já conhecia o Asp .Net MVC 1.0 isso não será um problema, aliás, a versão 2.0 vem com algumas melhorias. Estas melhorias são mais significativas do lado cliente onde foi adotado o jQuery 1.4 para realizar validações.

Ok, parece meio complexo mas na verdade não é, e para provar isso vamos criar nosso primeiro projeto Asp .Net MVC.

Para todos os post utilizaremos o Visual Studio 2010 Release Candidate ou superior…hehehehe.

Para aqueles que ainda não o baixaram, sugiro que façam o download do mesmo neste link: Visual Studio 2010 Release Candidate

Então, mãos a obra!!

Vamos criar um projeto do tipo ASP.NET MVC 2 Web Application na linguagem C#, para isso abra o Visual Studio, selecione C# Language –> Web -> ASP.NET MVC 2 Web Application, selecione um diretório e salve a aplicação com o nome de MeuSiteMVC conforme figura 01.

mvc_01
Figura 01

Feito isso, o Visual Studio irá perguntar se você deseja criar um projeto de teste para a aplicação, marque a opção “Yes, create a unit test project” e clique Ok.

mvc_02
Figura 02

Será criado um projeto exemplo.

Na figura abaixo você poderá observar a estrutura do projeto criado utilizando o Solution Explorer.

mvc_03
Figura 03

Nele temos nossos dois projetos criados, um projeto Asp Net MVC e outro Unit Test.

Quando criamos nosso projeto ASP.NET MVC Web, ele cria os componentes separados por pastas conforme veremos abaixo:

  • App_data: Diretório onde é armazenado o banco de dados. Segue a mesma regra do Asp Net Web Site.
  • Content: Na pasta Content armazenamos as imagens, os CSS, basicamente esta pasta guarda os arquivos estáticos.
  • Controllers: Pasta onde ficam armazenados as classes de controle “Controller Classes”. Estas classes são responsáveis por controlar a interação com o usuário, manipulação do modelo (Model) e definir a visualização (View) a ser renderizada.
  • Models: A pasta Models é responsável por guardar as classes que representam o modelo da aplicação. O modelo é responsável pela interação da lógica com o banco de dados.
  • Scripts: Local para armazenar os arquivos JavaScript.
  • Views: Pasta onde ficam guardados os componentes responsáveis pela visualização. Os Views podem ser .aspx, .ascx e também Master Pages .master. Esta pasta contem sub-pastas, sendo que estas devem seguir um padrão de nomenclatura, como por exemplo se você tiver a sub-pasta LoginController na pasta Controller, obrigatoriamente você deverá ter uma sub-pasta Login dentro da pasta View.
  • Views\Shared: Por padrão, é criado uma sub-pasta chamada Shared dentro da pasta View. Ela é responsável por manter arquivos que são compartilhados por toda a aplicação e que não possuem nenhuma relação com a pasta Controller.

Na figura 04 vemos a estrutura de pastas conforme explicado acima.

mvc_04
Figura 04

Antes de prosseguirmos, rode a aplicação só para termos certeza que tudo está configurado de forma correta. Sua tela deverá estar como na figura 05.

mvc_05
Figura 05

Ok! Projeto funcionando, vamos ver agora como funciona o "life cycle" de uma aplicação MVC.

Basicamente teremos 5 etapas a serem seguidas.

  1. É criado a Tabela de Roteamento "Route Table" - assim que a aplicação é iniciada pela primeira vez é gerada uma tabela de roteamentos;
  2. Recebimento das requisições pelo UrlRoutingModule - assim que você fizer qualquer requisição, esta é interceptada pelo UrlRoutingModule que cria os eventos necessários;
  3. Execução do MvcHandler - o MvcHandler cria o controller, envia para o ControllerContext e executa o controle;
  4. Execução do Controller - o Controller determina qual método deve ser executado, cria os parâmetros e executa o método;
  5. Chamada ao método RenderView - o método do Controller chama RenderView() para retornar ao browser a requisição. Controller.RenderView() delega esta chamada para uma ViewEngine.

 

mvc_06
Figura 06 – MVC Lifecycle

Agora que você já conhece o MVC lifecycle, vamos entender o Model, o View e o Controller.

Controller

Um Controller é responsável por gerenciar a maneira como um usuário interage com uma aplicação Asp .Net MVC, basicamente ele possui o fluxo de controle lógico da aplicação isto porque, ele é o responsável por determinar que resposta será enviada de volta ao usuário quando ele fizer uma requisição via navegador.

Observe na listagem abaixo que temos dois métodos “Index()” e “About()” dentro da classe HomeController, toda vez que você fizer uma requisição, as chamadas serão roteadas para os métodos dentro das classes Controller da aplicação, desta forma a url /Home/Index chamará o método Index() e a url/Home/About  chamará o método About().

Listagem 01

using System;

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MeuSiteMVC.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";
            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    }
}

 

View

Os dois métodos “Index()” e “About()”, do controlador expostos pela classe HomeController,  retornam uma visão que contém o código HTML e o conteúdo que é enviado ao navegador; assim uma visão (view) é equivalente a uma página em uma aplicação ASP .NET MVC. Atente para a criação de novas visualizações, pois as mesmas devem ser criadas dentro da pasta “View” com o mesmo nome do Controller.

mvc_07
Figura 07

No exemplo o nosso controlador Home possui duas ações Index() e About(), logo foi criada a sub-pasta Home na pasta Views e dentro da sub-pasta Home foram criadas as páginas Index.aspx e About.aspx.

Model

O Model é responsável por conter toda a lógica que não estiver contida nas classes Controller, como exemplo temos acesso a dados.
 

Bem, chegamos ao fim deste post, mas não ao final do nosso Asp .Net MVC 2.0.

Nos próximos posts sobre MVC iremos abordar itens mais interessantes e mais complexos, além de darmos uma olhada mais a fundo entre MVC e Web Forms.

Espero que tenham gostado e nos vemos no próximo post!

Até mais.

Postado em @ 3/10/2010 9:18 PM por Luciano Lima

Wiki do Paulovich.Data no Codeplex!

O Paulovich.Data possuía toda a documentação na wiki do nosso falecido Community Server. E durante a migração para o SubText deixamos isso de lado pra darmos conta de entregar um site novinho pra vocês.

Agora que eu parei de brincar de fazer modificações no SubText pude me concentrar em disponibilizar novamente a documentação. Optei por hospedar a documentação no Codeplex.

Mas não tive tempo suficente para ajustar imagens e nem de revisar textos. Por isso,  espero contar com a ajuda de vocês para termos novamente uma documentação 100%.

Se você não conhece o Paulovich.Data, sugiro que passe por lá! Você vai aprender técnicas avançadas de Reflection, ADO.NET, OO e mais algumas maluquices aleatórias.

Se você é um usuário do Paulovich.Data e tem vontade de contribuir ou tem alguma dúvida, entre em contato.

Postado em @ 3/9/2010 11:08 PM por Ivan Paulovich

Ctrl + Shift + B: Episódio 1

+

Como iniciativa para 2010 os DotNetRaptors começam um novo projeto. A idéia é levarmos notícias da comunidade através de podcasts. E já temos um piloto, está disponível na página dos Raptors o link para download do primeiro episódio.

Passamos por temas diversos como vocês podem ver na chamada, mas eu falei especificamente sobre o Community Zone de Fevereiro e da Copa de Talentos Microsoft que está prestes a ser lançada.

Postado em @ 3/9/2010 1:05 PM por Ivan Paulovich

Login e Logout restrito a pastas da Web Application

Com certeza vocês já viram aplicativos na internet que são criados apenas configurando alguns dados e você tem uma nova instância do serviço. Nos bastidores existe apenas uma aplicação instalada e essa aplicação interpreta a URL para identificar o cliente.

Recentemente eu criei um aplicativo semelhante. Vejam a descrição do requisito:

Ter uma única aplicação ASP.NET que responda a requisições aos endereços meudominio.com/umcliente e meudominio.com/outrocliente, além disso um usuário autenticado no primeiro endereço não deve ter acesso aos recursos do outro cliente.

Vejam que o requisito pede um aplicativo instânciável (ok! fiz isso usando routing). O problema estava em autenticar o usuário apenas na sua pasta. E eu não queria ter que verificar em cada requisição se o usuário está autorizado ou não a acessar o recurso. O meu desejo era ter uma solução desacoplada.

Vamos estão ao código usado para autenticar:

public static void CreateTicket(string username, string host, string application, bool isPersistent, string userData, DateTime expiration)
{
FormsAuthentication.Initialize();

//
// Cria o ticket de autenticação
//
var ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, expiration, isPersistent, userData);

//
// Criptografa o ticket
//
string hash = FormsAuthentication.Encrypt(ticket);

//
// Guarda o cookie no navegador de acordo com as opções do usuário
//
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);

cookie.Domain = host;

if (!string.IsNullOrEmpty(application))
{
cookie.Path = "/" + application + "/";
}

if (ticket.IsPersistent)
cookie.Expires = ticket.Expiration;

HttpContext.Current.Response.Cookies.Add(cookie);
}

Observe que eu defino no cookie as propriedades Domain e Path. E eu preciso definir essas propriedades para que o navegador não compartilhe o cookie com as aplicações que estão nas outras pastas.

O signout também tem as suas sutilezas, pois o método FormsAuthentication.Signout() não funciona nesses casos. Você precisa fazer um método assim:

private void Signout(string host, string application)
{
System.Web.HttpCookie cookie;

cookie = FormsAuthentication.GetAuthCookie(Thread.CurrentPrincipal.Identity.Name, false);
cookie.Domain = host;

if (!string.IsNullOrEmpty(application))
{
cookie.Path = "/" + application + "/";
}

cookie.Expires = DateTime.Now.AddDays(-1);
Response.AppendCookie(cookie);

}

Se você sentiu interesse em saber um pouco mais, visite o artigo Single Sign On across multiple ASP.NET applications no Developer Corner.

Postado em @ 3/8/2010 1:58 PM por Ivan Paulovich

Fazendo o dia das mulheres mais feliz

Uma amiga da Getsêmani participa de uma célula que está com um projeto interessante para o Dia das Mulheres. Trata-se de uma ação social na Vila Real I, uma comunidade carente aqui de Belo Horizonte.

O evento irá ocorrer no dia 14/03 e irá oferecer as mulheres da comunidade a oportunidade de conhecer o amor de Deus e palestras sobre higiene pessoal, sexualidade, valorização da mulher e valor da mulher para Deus.

E onde você entra nessa história? O projeto irá distribuir kits para as mulheres e você pode ajudar doando os seguintes itens:

  • Pente
  • Sabonete
  • Escova de dentes
  • Creme dental
  • Desodorante
  • Hidratante corporal
  • Necéssaire
  • Pacote de absorvente

O custo estimado de um kit é R$ 23,50 e serão distribuídos 60 kits. Você pode fazer as doações pessoalmente ou entrar em contato com a Sabrina no telefone (31) 8577-0317.

Se você tem dúvidas sobre o projeto que tal dar uma olhada no que fizemos no Natal do ano passado.

Postado em @ 3/7/2010 2:13 PM por Ivan Paulovich

ReturnUrl do FormsAuthentication com url completa

Imagine que você possui uma solução que contém várias aplicações web rodando no seu próprio domínio (www.clienteA.com.br ou www.clienteZ.org.br) e que precisam usar um único endereço para autenticação como login.dominio.com. A princípo os clientes precisam redirecionar seus clientes para login.dominio.com quando quiserem se autenticar e em seguida login.dominio.com leva os clientes de volta.

Mas há um pequeno problema no redirecionamento dos nossos clientes para a página de login quando usamos FormsAuthentication. A variável ReturnUrl que contém o endereço de retorno é montada relativamente ao cliente. E com isso não temos a informação para trazer o cliente de volta a url inicial.

A princípio não há uma propriedade no FormsAuthentication que defina que a variável ReturnUrl precisa ser montada com a URL completa. Mas não se desespere! Eu fiz uma busca por soluções a esse problema, e encontrei uma forma bastante simples.

Basta que você trate a variável ReturnUrl no evento Application_EndRequest. Abaixo o código que encontrei no blog do David Findley:

protected void Application_EndRequest(object sender, EventArgs e)
{
string redirectUrl = this.Response.RedirectLocation;
if (!string.IsNullOrEmpty(redirectUrl))
{
this.Response.RedirectLocation = Regex.Replace(redirectUrl,
"ReturnUrl=(?'url'.*)",
delegate(Match m)
{
string url = HttpUtility.UrlDecode(m.Groups["url"].Value);
Uri u = new Uri(this.Request.Url, url);
return string.Format("ReturnUrl={0}",
HttpUtility.UrlEncode(u.ToString()));
}, RegexOptions.Singleline |
RegexOptions.IgnoreCase |
RegexOptions.ExplicitCapture);
}
}

Com o código acima sua aplicação de login terá a url completa para enviar os usuários de volta.

Postado em @ 3/7/2010 1:37 PM por Ivan Paulovich

Copa de Talentos Microsoft

Copa de Talentos Microsoft

A Copa de Talentos Microsoft será lançada em todo Brasil no dia 20 de Março. Será um concurso no formato do Win The 7 e o objetivo principal é a capacitação nos produtos e o engajamento da comunidade.

Em breve a Microsoft abrirá inscrições para o concurso mas como é uma competição técnica. Já vale começar a se preparar, que tal começar a se preparar?

Então acesse já o link para download do Training Kit do Visual Studio 2010 e do .NET Framework 4.0.

Postado em @ 3/5/2010 9:48 AM por Ivan Paulovich