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á acomplexibilidade dele, escalabilidade 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 materia de desing e controle dos componentes.

Para quem ja 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 esta 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 MeeSiteMVC 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 nosso dois projetos criados, um projeto Asp Net MVC e outro Unit Test.

Qunado 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 renderezada.
  • 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 armazenas 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 serguir um padrão de nomeclatura, 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 tal deve parecer conforme a 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ê fizem 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 metodo deve ser executado, cria os parametros 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ê ja conhece o MVC lifecycle, vamos enteder 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 metodos “Index()” e “About()” dentro da classe HomeController, toda vez que você fizer uma requisição, as chamadas serão roteadas para os metodos 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 metodos “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 logica 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

Comentários de volta

Pra quem sentiu falta da possibilidade de comentar no 100loop finalmente o alívio: os comentários foram reabilitados! Pra quem se interessar o motivo de eu ter removido o formulário é porquê estava dando um pequeno erro. E por falha minha, eu fui corrigir o erro mas acabou causando um erro maior.

E só agora tive uns minutos para concentrar nesse problema. Aliás, aproveitei pra mudar o tema do site. Espero que animem novamente a escrever por aqui.

Postado em @ 3/4/2010 11:48 PM por Ivan Paulovich

Brazil SubText no Codeplex

Comecei um novo projeto open source no Codeplex. O projeto é uma iniciativa para atender a comunidade brasileira de desenvolvedores e entusiastas.

Brazil SubText se propõe a localizar o projeto SubText e realizar modificações para fornecer a comunidade brasileira uma ferramenta robusta em interatividade.

Optei por criar esse projeto Brazil SubText pois já uso o SubText no 100loop e gosto muito dessa ferramenta e paralelo a isso percebo uma necessidade dos desenvolvedores brasileiros em criarem blogs de seus grupos.

Abaixo um pequeno questionário o projeto.

  • Por que mudar para o Codeplex? Por que já usamos o Codeplex há alguns anos e estamos mais familiarizados com a integração do Team Explorer.
  • Vocês participam do projeto original no subtextproject.com? Participamos da lista de discussões e exporadicamente conversamos com alguém do projeto original.
  • Por que localizar o sistema para o Brasil? Por que não há uma ferramenta tão flexível como o SubText que atenda o idioma português.
  • Vocês pretendem modificar o Core do aplicativo? Se for necessário sim.
  • Quem são vocês? Somos da comunidade brasileira de desenvolvedores.

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

Os caminhos da informação

Desde o surgimento da escrita o homem gera informação. A princípio o processo de criação da informação era demorado e desconectado entre comunidades de pessoas. Além disso os dados criados não possuiam segurança. A maioria estava literalmente ao léu.

Com o tempo e o crescimento tecnológico aprendemos a imprimir. E hoje nós podemos contar com as maravilhas de um bom livro. Essa nova tecnologia despertou no homem ainda mais a necessidade de gerar informações. E com isso milhões e milhões de títulos foram criados através dos séculos.

O mundo atual está cada vez mais buscando conhecimento e a mídia usada nos livros não permite uma consulta eficiente, é simplesmente limitada quando temos um catálogo um pouco maior.

Já no último século o homem passou a armazenar seus dados nos computadores, conseguindo assim ter mais conhecimento em um espaço muito menor e isso permitiu que ele gerasse mais e mais informações.

Eis, que surge o mesmo problema. Agora podemos criar uma enorme quantidade de informações e ainda estávamos desconectados uns dos outros.

Com o advento da internet passamos a colocar nossos dados na núvem, ganhamos com isso grande facilidade de compartilhar informações e podemos consumir os dados em diversos tipos de mídia. Agora temos que administrar tudo isso.

É aí que a Microsoft entra, que tal dar uma olhada em um vídeo sobre o SQL 2008 R2?

E agora, a informação da sua empresa caminha pra onde?

Postado em @ 3/1/2010 8:52 AM por Ivan Paulovich