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
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
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, 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 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.
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.
Figura 02
Será criado um projeto exemplo.
Na figura abaixo você poderá observar a estrutura do projeto criado utilizando o Solution Explorer.
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.
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.
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.
- É criado a Tabela de Roteamento "Route Table" - assim que a aplicação é iniciada pela primeira vez é gerada uma tabela de roteamentos;
- Recebimento das requisições pelo UrlRoutingModule - assim que você fizer qualquer requisição, esta é interceptada pelo UrlRoutingModule que cria os eventos necessários;
- Execução do MvcHandler - o MvcHandler cria o controller, envia para o ControllerContext e executa o controle;
- Execução do Controller - o Controller determina qual método deve ser executado, cria os parâmetros e executa o método;
- 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.
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.
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
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
+
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
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
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
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
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
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