<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Robson Ramos</title>
	<atom:link href="http://robsonramos.com/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://robsonramos.com</link>
	<description>.Net, Agilidade e Arquitetura!</description>
	<lastBuildDate>Thu, 05 Jan 2012 18:59:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>Integrando Google Maps com Foursquare</title>
		<link>http://robsonramos.com/index.php/2012/01/05/integrando-google-maps-com-foursquare/</link>
		<comments>http://robsonramos.com/index.php/2012/01/05/integrando-google-maps-com-foursquare/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 18:59:18 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Foursquare]]></category>
		<category><![CDATA[Google Maps]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=403</guid>
		<description><![CDATA[Recentemente adicionei um projeto ao Github que, na minha opinião, vale a pena ser compartilhado aqui no blog. A minha intenção era adicionar um mapa na página web e quando o usuário clicasse no mapa a aplicação efetuaria a leitura do Foursquare buscando lugares cadastrados. Veja a página inicial abaixo: &#160; Assim, após o usuário [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente adicionei um projeto ao Github que, na minha opinião, vale a pena ser compartilhado aqui no blog.</p>
<p>A minha intenção era adicionar um mapa na página web e quando o usuário clicasse no mapa a aplicação efetuaria a leitura do Foursquare buscando lugares cadastrados.</p>
<p>Veja a página inicial abaixo:</p>
<p><img class="aligncenter" title="Integracao - Maps e Foursquare" src="http://robsonramos.com/wp-content/uploads/2012/IntegracaoMapsFoursquare1.png" alt="" width="600" height="450" /></p>
<p>&nbsp;</p>
<p>Assim, após o usuário clicar em algum lugar do mapa é exibido algumas opções de lugares. Veja abaixo:</p>
<p>&nbsp;</p>
<p><img class="aligncenter" title="Integracao - Maps e Foursquare" src="http://robsonramos.com/wp-content/uploads/2012/IntegracaoMapsFoursquare2.png" alt="" width="842" height="663" /></p>
<p>&nbsp;</p>
<p>O que á mais legal é que para qualquer lugar DO MUNDO é exibido opções de lugares&#8230;o que inicialmente eu não havia previsto.</p>
<p>Se quiser pegar o código: <a href="https://github.com/RobsonRamos/IntegrationGoggleMapsAndFoursquare" target="_blank">https://github.com/RobsonRamos/IntegrationGoggleMapsAndFoursquare</a></p>
<p>Até +!</p>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2012/01/05/integrando-google-maps-com-foursquare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Github</title>
		<link>http://robsonramos.com/index.php/2012/01/05/github/</link>
		<comments>http://robsonramos.com/index.php/2012/01/05/github/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 18:36:32 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[Comunidade]]></category>
		<category><![CDATA[Github]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=395</guid>
		<description><![CDATA[Ola pessoal, tudo bem? &#160; Gostaria de compartilhar o link para  a minha conta no Github: https://github.com/RobsonRamos &#160; Não sabe o que é Github? &#160; Github é um rede social para desenvolvedores, onde nós podemos compartilhar nossos projetos com os outros. Só tenho uma coisa a dizer: O Github é fantástico Tenho poucos projetos por enquanto, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="Github" src="http://robsonramos.com/wp-content/uploads/2012/Github.jpg" alt="Github" width="204" height="204" /></p>
<p>Ola pessoal, tudo bem?</p>
<p>&nbsp;</p>
<p>Gostaria de compartilhar o link para  a minha conta no Github: <a href="https://github.com/RobsonRamos" target="_blank">https://github.com/RobsonRamos</a></p>
<p>&nbsp;</p>
<h3 style="text-align: center;">Não sabe o que é Github?</h3>
<p>&nbsp;</p>
<p>Github é um rede social para desenvolvedores, onde nós podemos compartilhar nossos projetos com os outros.</p>
<p>Só tenho uma coisa a dizer: O Github é fantástico</p>
<p>Tenho poucos projetos por enquanto, mas, quando tiver mais tempo vou subir alguns que estão parados já faz um tempo.</p>
<p>&nbsp;</p>
<p>Até +!</p>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2012/01/05/github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML 5 &#8211; Novos componentes</title>
		<link>http://robsonramos.com/index.php/2012/01/03/html-5-novos-componentes/</link>
		<comments>http://robsonramos.com/index.php/2012/01/03/html-5-novos-componentes/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 15:48:11 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Componentes]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=365</guid>
		<description><![CDATA[Neste artigo vamos analisar alguns dos vários componentes introduzidos pelo HTML 5. Posso afirmar que há grandes novidades para a criação dos nossos formulários. Agora temos novos componentes, atributos,várias mudanças semânticas e também adição de dois tipos de form actions (update e delete). Obs: para a grande maioria dos exemplos abaixoutilizei a última versão do [...]]]></description>
			<content:encoded><![CDATA[<p>Neste artigo vamos analisar alguns dos vários componentes introduzidos pelo HTML 5. Posso afirmar que há grandes novidades para a criação dos nossos formulários. Agora temos novos componentes, atributos,várias mudanças semânticas e também adição de dois tipos de form actions (update e delete).</p>
<p>Obs: para a grande maioria dos exemplos abaixoutilizei a última versão do navegador Opera.</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">Componentes fora do formulário</h2>
<p>&nbsp;</p>
<p>Anteriormente, nossos componentes tinham que estar obrigatoriamente contidos dentro das tags do nosso  formulário para que pudessem ser submetidos para o servidor.</p>
<p><strong>Agora, isto não é mais necessário!</strong></p>
<p>Podemos ter nossos componentes em qualquer lugar da página apenas informando a qual formulário ele pertence. Observe o trecho abaixo:</p>
<pre class="brush: xml; title: ;">

&lt;form id=myForm&gt;

&lt;input type=text&gt;

...

&lt;/form&gt;

&lt;textarea form=myForm&gt;&lt;/textarea&gt;
</pre>
<p>Podemos observar que a área de texto (textarea) não está dentro da nossa tag form, ela está fora dela e através do atributo form indicamos a qual formulário o componente pertence.</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">Novos componentes</h2>
<p>&nbsp;</p>
<p>Com a nova versão do HTML novos componentes foram introduzidos, tornando ainda mais prazeroso trabalhar com a linguagem.</p>
<p>Chega de ter que recorrer à biblioteca de terceiros (JQuery UI e outras) para ter que usar um calendário ou uma slide bar.</p>
<p>Agora temos a possibilidade de usar os próprios recursos nativos sem ter que necessitar de biblioteca de terceiros para suprir a falta de componentes.</p>
<p>Vale lembrar que a especificação não define como cada navegador ou dispositivo apresentará cada componente. Portanto, podemos ter diferentes aparências para um mesmo componente dependendo do fabricante ou dispositivo.</p>
<p>&nbsp;</p>
<h3 style="text-align: center;">Email</h3>
<p>&nbsp;</p>
<pre class="brush: xml; title: ;">
&lt;body&gt;
   &lt;input type=email&gt;
&lt;/body&gt;
</pre>
</pre>
<p>Viram como é fácil a sua utilização?</p>
<p>A tag acima diz ao browser não submeter o formulário se o usuário não entrar com um formato válido de e-mail (claro que não é checado se o e-mail existe!). Mas, a especificação não define como será exibida a mensagem de erro para o usuário.</p>
<p>Além disso,  é importante consultar as regras de validação no site da W3C.</p>
<p>Caso as regras de validação não atendam a sua necessidade, fique tranquilo! É possível customizá-la, o que faremos em artigos mais adiante.</p>
<p>Podemos visualizar como o Chrome e o Opera se comportam quando entramos com um e-mail com formato incorreto:</p>
<h3 style="text-align: -webkit-auto;"><span style="font-size: x-small;"><span style="font-weight: normal;"><img class="alignleft" title="Email - Chrome" src="http://robsonramos.com/wp-content/uploads/2012/Email_Chrome.png" alt="Email - Chrome" width="366" height="120" /><br />
</span></span></h3>
<h3 style="text-align: center;"></h3>
<h3 style="text-align: center;"></h3>
<p><img class="alignnone" title="Email - Opera" src="http://robsonramos.com/wp-content/uploads/2012/Email_Opera.png" alt="Email - Opera" width="417" height="117" /></p>
<h3 style="text-align: center;">Data, hora, mês e semana</h3>
<p>&nbsp;</p>
<pre class="brush: xml; title: ;">

&lt;body&gt;
 &lt;input type=datetime&gt;
 &lt;input type=date&gt;
 &lt;input type=time&gt;
 &lt;input type=month&gt;
 &lt;input type=week&gt;
&lt;/body&gt;
</pre>
<p>As tags acima são auto-explicativas e tornam a tarefa de trabalhar com datas/horas muito mais fácil, sem necessitar de bibliotecas de terceiros.</p>
<p>Obseve abaixo o efeito no navegador Opera:</p>
<p><img class="alignleft" title="Datetime - Opera" src="http://robsonramos.com/wp-content/uploads/2012/Datetime_Opera.png" alt="Datetime - Opera" width="423" height="357" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="text-align: center;">Podemos ver que o navegador forneceu nativamente um calendário, facilitando bastante o nosso trabalho.</span></p>
<p>&nbsp;</p>
<h3 style="text-align: center;">Number</h3>
<pre class="brush: xml; title: ;">

&lt;body&gt;
 &lt;input type=number&gt;
&lt;/body&gt;
</pre>
<p>&nbsp;</p>
<p>Permite somente a entrada de valores numéricos. Veja abaixo o efeito gerado por esta tag:</p>
<p><img class="alignnone" title="Number - Opera" src="http://robsonramos.com/wp-content/uploads/2012/Number_Opera.png" alt="Number - Opera" width="194" height="69" /></p>
<h3 style="text-align: center;">Range</h3>
<pre class="brush: xml; title: ;">
&lt;body&gt;
 &lt;input type=range&gt;
 &lt;/body&gt;
 </pre>
<p>&nbsp;</p>
<p>O componente range é um dos meus favoritos e permite que o usuário selecione através de um slider valores dentro de aguns limites possíveis. Observe o efeito nos nossos amigos Chrome e Opera:</p>
<p><img class="alignleft" title="Range - Chrome" src="http://robsonramos.com/wp-content/uploads/2012/Range_Chrome.png" alt="Range - Chrome" width="205" height="76" /><img class="aligncenter" title="Range - Opera" src="http://robsonramos.com/wp-content/uploads/2012/Range_Opera.png" alt="Range - Opera" width="246" height="87" /></p>
<p>Posteriormente, faremos um exemplo mais elaborado utilizando os novos atribuos max, min e step =)</p>
<p>&nbsp;</p>
<h3 style="text-align: center;">Search</h3>
<pre class="brush: xml; title: ;">
&lt;body&gt;
 &lt;input type=search&gt;
&lt;/body&gt;
</pre>
<p>&nbsp;</p>
<p>Especifica um campo de busca. Com a ajuda do navegador, pode ser fornecido ao usuário um histórico das páginas visitadas recentemente. A diferença entre este campo e um campo de texto é apenas semântica.</p>
<p><img class="alignleft" title="Search - Chrome" src="http://robsonramos.com/wp-content/uploads/2012/Search_Chrome.png" alt="Search - Chrome" width="268" height="81" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 style="text-align: center;">Tel</h3>
<pre class="brush: xml; title: ;">
&lt;body&gt;
 &lt;input type=tel&gt;
&lt;/body&gt;
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Esta tag espera um telephone como entrada, porém, não há nenhuma validação especial definida pela especificação. Mas, com o HTML5 podemos adicionar aos nossos componentes regras de validação.</p>
<p>Assim como a tag search, a diferença é apenas semântica. Alguns dispositivos podem facilitar a vida do usuário apenas exibindo o teclado numérico quando o foco estiver neste campo.</p>
<p><img class="alignleft" title="Tel - Opera" src="http://robsonramos.com/wp-content/uploads/2012/tel_Opera.png" alt="Tel - Opera" width="229" height="70" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 style="text-align: center;">Color</h3>
<pre class="brush: xml; title: ;">

&lt;body&gt;

&lt;input type=color&gt;

&lt;/body&gt;
</pre>
<p>&nbsp;</p>
<p>Permite que os usuários entrem com uma cor válida. Podemos ver abaixo que o Opera exibe uma paleta de cores com algumas opções:</p>
<p><img class="alignleft" title="Color - Opera" src="http://robsonramos.com/wp-content/uploads/2012/Color_Opera.png" alt="Color - Opera" width="396" height="146" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Para concluir, vale lembrar que muitos navegadores não possuem suporte à estas tags e que muita coisa ainda está por vir, mas, vimos o quanto o HTML 5 facilitará a nossa vida =) No próximo artigo irei abordar alguns novos atributos para que possamos fazer alguns exemplos mais elaborados. Até a próxima!</p>
<p>&nbsp;</p>
<p><strong>Consulte a série de artigos sobre HTML5:</strong> <a href="http://robsonramos.com/index.php/category/html-5/" target="_blank">http://robsonramos.com/index.php/category/html-5/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2012/01/03/html-5-novos-componentes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 – Introdução</title>
		<link>http://robsonramos.com/index.php/2011/12/31/html5-introducao/</link>
		<comments>http://robsonramos.com/index.php/2011/12/31/html5-introducao/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 02:50:36 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[Introdução]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=358</guid>
		<description><![CDATA[&#160; Recentemente decidi focar meus estudos em HTML 5 e tentar entender o que mudou e o motivo pelo qual esta tecnologia esta gerando tanto “barulho”. &#160; História &#160; A última versão até então era o XHTML 1.0, que tentava aproximar o HTML com XML. Foram desenvolvidas duas versões: Transitional: Não tão rigorosa, tinha a [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="HTML 5" src="http://robsonramos.com/wp-content/uploads/2011/12/HTML5.jpg" alt="HTML 5" width="318" height="159" /></p>
<p>&nbsp;</p>
<p>Recentemente decidi focar meus estudos em HTML 5 e tentar entender o que mudou e o motivo pelo qual esta tecnologia esta gerando tanto “barulho”.</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">História</h2>
<p>&nbsp;</p>
<p>A última versão até então era o XHTML 1.0, que tentava aproximar o HTML com XML. Foram desenvolvidas duas versões:</p>
<ul>
<li>Transitional: Não tão rigorosa, tinha a finalidade de ajudar as pessoas a moverem seus sites para esta nova especificação.</li>
</ul>
<ul>
<li>Strict: Mais rigorosa, pois, na sua validação mais regras eram aplicadas.</li>
</ul>
<p>&nbsp;</p>
<p>Após isso, os trabalhos se reiniciaram visando a versão 2.0 do XHTML, porém, esta nova especificação propunha mais alterações na linguagem, o que quebraria a compatibilidade com as versões anteriores. Então, um pequeno grupo, que trabalha(va) para empresa Opera, e que não estava contente com a união com o XML começou a trabalhar em uma nova especificação do HTML sem quebrar a compatibilidade das versões anteriores. Com isso, o grupo aumentou de tamanho, ganhando a adesão de membros da Mozilla (liderados por Ian Hickson). Assim, este grupo se auto-intitulou WHATWG (Web Hypertext Application Technology Working Group, <a href="http://www.whatwg.org">www.whatwg.org</a>).</p>
<p>Em 2006, a W3C reconheceu que talvez tenha sido otimista demais em esperar que todos mudassem para algo similar ao XML e quebrar a compatibilidade existente. Então, foi decidido usar a especificação que estava sendo desenvolvida pelo WHATWG como a nova especificação do HTML.</p>
<p>Assim, o processo de definição da nova especificação foi aberto, qualquer um poderia contribuir e dar sugestões bastando enviar e-mails ou participar da lista de discussão do WHATWG.</p>
<p>&nbsp;</p>
<p>A especificação e novas idéias têm sido desenvolvidas com uma velocidade muito grande e, portanto, o HTML 5 tem grande chance de se tornar um padrão de fato. Um número muito grande de empresas têm apoiado o projeto e os fabricantes de browsers (inclusive o IE da Microsoft) se comprometeram a implementar as especificações numa colaboração nunca antes vista.</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">Estrutura básica</h2>
<p>&nbsp;</p>
<p>Analise o trecho abaixo:</p>
<p>&nbsp;</p>
<pre class="brush: xml; title: ;">

&lt;!doctype html&gt;

&lt;html lang=en&gt;

&lt;head&gt;

&lt;meta charset=utf-8&gt;

&lt;title&gt;HTML 5&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;p&gt;Um parágrafo qualquer...&lt;/p&gt;

&lt;/body&gt;

&lt;/html&gt;
</pre>
<p>&nbsp;</p>
<p>A primeira coisa que podemos notar é que o doctype é muito simples, nada de urls nem número de versão.</p>
<p>Na tag html não é mais necessário usar as aspas (repare a definição da lang). Mas, quando houver espaço nos valores, será necessário utilizá-las.</p>
<p>&nbsp;</p>
<p>Na quarta linha é definida a tag meta e o encoding da página (lembre-se como era definida esta tag antes: &lt;meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8”&gt;.). Pelo que eu tenho lido, não definir o enconding tem gerado um erro estranho em alguns navegadores.</p>
<p>&nbsp;</p>
<p>Obs: Apesar das tags html e body serem opcionais, decidi incluí-las neste exemplo.</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">Novos elementos</h2>
<p>&nbsp;</p>
<p>Em 2004, Ian Hickson utilizou o Google Index analisou uma lista de sites e observou como eles estavam estruturados. Basicamente, haviam as mesmas classes de elementos nos sites (por exemplo: footer, menu, text, content, title, main, clear, search, nav, logo). Com base nisso, você perceberá que muitos elementos foram criados com estes nomes, com a finalidade de obter uma melhor semântica nas nossas páginas.</p>
<p>&nbsp;</p>
<p>Sendo assim, ao invés de criarmos div&#8217;s genéricas da seguinte forma:</p>
<p>&lt;div class=”header”&gt;</p>
<p>&lt;div class=”nav”&gt;</p>
<p>&lt;div class=”content”&gt;</p>
<p>&lt;div class=”footer” &gt;</p>
<p>&nbsp;</p>
<p>Passaremos a usar elementos que definirão de uma forma mais inteligente o que conteúdo das nossas páginas, por exemplo:</p>
<p>&nbsp;</p>
<p>&lt;header&gt;&lt;/header&gt;</p>
<p>&lt;nav&gt;&lt;/nav&gt;</p>
<p>&lt;footer&gt;&lt;/ footer &gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Bom, esta é uma introdução MUITO básica sobre o que é o HTML 5.</p>
<p>Por hoje é só, mas, vou continuar postando sobre este assunto em breve!</p>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2011/12/31/html5-introducao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EF Code First – Criando chaves que não sejam Identity</title>
		<link>http://robsonramos.com/index.php/2011/12/22/ed-code-first-criando-chaves-que-nao-sejam-identity/</link>
		<comments>http://robsonramos.com/index.php/2011/12/22/ed-code-first-criando-chaves-que-nao-sejam-identity/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 17:21:53 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Code First]]></category>
		<category><![CDATA[Identity]]></category>
		<category><![CDATA[PK]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=337</guid>
		<description><![CDATA[Na construção de nossas aplicações há alguns casos em que queremos que uma coluna seja chave primária de uma determinada tabela, mas, queremos que esta informação não seja gerada pelo banco de dados, ou seja, queremos que esta informação seja fornecida pelo usuário ou seja obtida de outra forma (através de um cálculo ou através [...]]]></description>
			<content:encoded><![CDATA[<p>Na construção de nossas aplicações há alguns casos em que queremos que uma coluna seja chave primária de uma determinada tabela, mas, queremos que esta informação não seja gerada pelo banco de dados, ou seja, queremos que esta informação seja fornecida pelo usuário ou seja obtida de outra forma (através de um cálculo ou através de uma consulta a um sistema externo).</p>
<p>Para exemplificar, vamos então analisar a classe abaixo:</p>
<pre class="brush: csharp; title: ;">
public class Pessoa
{
    public int CPF { get; set; }
    public string Nome { get; set; }
    public string Sobrenome { get; set; }
    public int Idade { get; set; }
}
</pre>
<p>&nbsp;<br />
Como você pode ver esta classe é bem simples, ela contêm algumas informações de cadastro de uma pessoa. A  nossa intenção principal aqui é que a informação de CPF seja fornecida pelo usuário que esteja efetuando o cadastro.<br />
&nbsp;<br />
Vamos criar então outra classe chamada PessoaConfiguration, conforme abaixo:</p>
<pre class="brush: csharp; title: ;">
class PessoaConfiguration : EntityTypeConfiguration&lt;Pessoa&gt;
{
    public PessoaConfiguration()
    {
        HasKey(p =&gt; p.CPF);
        Property(p =&gt; p.Nome).IsRequired();
        Property(p =&gt; p.Sobrenome).IsRequired();
    }
}
</pre>
<p>&nbsp;<br />
Obs: Se você quiser aprender mais sobre o código acima, sugiro a leitura do artigo:<br />
<a href="http://robsonramos.com/index.php/2011/12/22/ef-code-first-data-annotations-x-fluent-api/" target="_blank">Data Annotations x Fluent Api</a><br />
&nbsp;</p>
<p>Esta classe faz uso da Fluent API para configurar a classe Pessoa. Sendo assim, configuramos a propriedade CPF como chave primária da tabela e informamos que a propriedade Nome e Sobrenome serão obrigatórias.<br />
&nbsp;</p>
<h2 style="text-align: center;">Mas, o que há de errado com o código acima?</h2>
<p>&nbsp;<br />
Vamos então tentar criar um registro no banco de dados. Veja o código abaixo:</p>
<pre class="brush: csharp; title: ;">
static void Main(string[] args)
{
       var pessoa = new Pessoa
       {
           Nome = &quot;Robson&quot;,
           Sobrenome = &quot;Ramos&quot;
       };

       using (var context = new Context())
       {
          context.Pessoas.Add(pessoa);
          context.SaveChanges();
       }
}
</pre>
<p>&nbsp;<br />
O código acima efetua a criação de um objeto Pessoa e efetua a inserção no banco de dados. Observe que não forneci a informação de CPF (que estava configurada como obrigatória). Veja como o registro foi criado na tabela:<br />
&nbsp;<br />
<img class="aligncenter" src="http://robsonramos.com/wp-content/uploads/2011/12/EF1.png" alt="" /><br />
&nbsp;<br />
Apesar da propriedade CPF ser configurada como obrigatória, o banco de dados gerou um id para ela. Isto aconteceu devido ao modo de funcionamento do Entity Framework: ao encontrar um campo inteiro configurado como chave primária ele então configurará a chave primária como Identity (auto-incrementável) no banco de dados.</p>
<p>Para resolvermos este problema, basta efetuar a seguinte configuração na classe PessoaConfiguration. Conforme abaixo:</p>
<p>&nbsp;</p>
<pre class="brush: csharp; title: ;">
class PessoaConfiguration : EntityTypeConfiguration&lt;Pessoa&gt;
{
    public PessoaConfiguration()
    {
        HasKey(p =&gt; p.CPF);
        Property(p =&gt; p.CPF).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        Property(p =&gt; p.Nome).IsRequired();
        Property(p =&gt; p.Sobrenome).IsRequired();
    }
}
</pre>
<p>&nbsp;<br />
Observe sexta linha do código acima, esta instrução diz que a coluna CPF não terá seu valor gerado pelo banco de dados, ou seja, estamos sobrescrevendo a convenção do Entity Framework para que o valor seja informado no momento da inserção do registro.</p>
<p>Agora, precisamos alterar o código que instancia o objeto pessoa informando um número de CPF. Veja abaixo:</p>
<pre class="brush: csharp; title: ;">
static void Main(string[] args)
{
            var pessoa = new Pessoa
            {
                CPF = 12345678,
                Nome = &quot;Robson&quot;,
                Sobrenome = &quot;Ramos&quot;
            };

            using (var context = new Context())
            {
                context.Pessoas.Add(pessoa);
                context.SaveChanges();
            }
}
</pre>
<p>&nbsp;<br />
Agora, se olharmos na tabela podemos verificar que a informação agora foi salva com sucesso:<br />
&nbsp;<br />
<img class="aligncenter" src="http://robsonramos.com/wp-content/uploads/2011/12/EF2.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2011/12/22/ed-code-first-criando-chaves-que-nao-sejam-identity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EF Code First &#8211; Data Annotations x Fluent API</title>
		<link>http://robsonramos.com/index.php/2011/12/22/ef-code-first-data-annotations-x-fluent-api/</link>
		<comments>http://robsonramos.com/index.php/2011/12/22/ef-code-first-data-annotations-x-fluent-api/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 02:03:39 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Data Annotation]]></category>
		<category><![CDATA[Fluent API]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=318</guid>
		<description><![CDATA[Ao se trabalhar com o Entity Framework usando o modo Code First há a possibilidade de se trabalhar de duas formas com as configurações do nosso Model : Data Annotations e Fluent API. Neste artigo mostarei como cada configuração sem comporta e tentarei estabelecer os prós e contras de cada uma. Para iniciarmos crie um [...]]]></description>
			<content:encoded><![CDATA[<p>Ao se trabalhar com o Entity Framework usando o modo Code First há a possibilidade de se trabalhar de duas formas com as configurações do nosso Model : Data Annotations e Fluent API. Neste artigo mostarei como cada configuração sem comporta e tentarei estabelecer os prós e contras de cada uma.</p>
<p>Para iniciarmos crie um projeto do tipo Console Application (dê o nome que você acha mais conveniente) e usando o Nuget procure o pacote do Entity Framework e clique em Install. Conforme abaixo:</p>
<p><img src="http://robsonramos.com/wp-content/uploads/2011/12/Nuget.png" alt="NuGet" width="500" /></p>
<p>Após isso, crie uma classe chamada Carro e adicione algumas propriedades igual ao código abaixo:</p>
<pre class="brush: csharp; title: ;">
class Carro
{
    public int CarroId             { get; set; }
    public string Fabricante       { get; set; }
    public string Modelo           { get; set; }
    public string Placa            { get; set; }
}
</pre>
<h2 style="text-align: center;">Data Annotations</h2>
<p>Data Annotations são atributos que aplicamos diretamente ao nosso Model com a finalidade de efetuarmos validações, definir formatos de campos, ajudar o Entity Framework no processo de geração do banco de dados, dentre outras coisas&#8230;</p>
<p>Vamos então alterar a nossa classe criada anteriormente.</p>
<pre class="brush: csharp; title: ;">

[Table(&quot;Automoveis&quot;)]
class Carro
{
[Key]
public int CarroId { get; set; }

[Required]
public string Fabricante { get; set; }

[Required]
public string Modelo { get; set; }

[MaxLength(8)]
public string Placa { get; set; }
}
</pre>
<p>Obs: Para o código acima é necessário referenciar o assembly System.ComponentModel.DataAnnotations</p>
<p>O código acima efetuou as seguintes configurações:</p>
<p>•	Esta classe será mapeada para a tabela Automóveis<br />
•	A propriedade CarroId é chave primária<br />
•	A propriedade Fabricante é obrigatória<br />
•	A propriedade Modelo também é obrigatória<br />
•	A propriedade Placa deve ter no máximo dígitos</p>
<h2 style="text-align: center;">Fluent API</h2>
<p>O conceito de Fluent API não vêm do Code First, mas, a sua idéia principal é usar chamada de métodos para produzir código fácil de ler e entender aos olhos do desenvolvedor. Com a ajuda do IntelliSense e fazendo uso de expressões lambda podemos configurar as nossas classes usando uma classe separada só para cuidar disso.</p>
<p>Antes de fazermos as alterações, remova os atributos adicionados no passo anterior. Embora seja possível trabalhar das duas maneiras é recomendável usar apenas umas das duas formas.</p>
<p>Depois disso, crie mais uma classe chamada CarroConfiguration e adicione o código abaixo:</p>
<pre class="brush: csharp; title: ;">
class CarroConfiguration : EntityTypeConfiguration&lt;Carro&gt;
{
    public CarroConfiguration()
    {
        ToTable(&quot;Automoveis&quot;);
        HasKey(c =&gt; c.CarroId);
        Property(c =&gt; c.Fabricante).IsRequired();
        Property(c =&gt; c.Modelo).IsRequired();
        Property(c =&gt; c.Placa).HasMaxLength(8);
    }
}
</pre>
<p>Pronto, é só isso!</p>
<p>As configurações acima tratam-se das mesmas configurações realizadas utilizando o Data Annotation.</p>
<p>Mas, para que o Entity Framework possa reconhecer a nossa classe como &#8220;configuradora&#8221; da classe Carro precisamos registrá-la no processo de criação do Model, mas, isso é assunto para outro post. =)</p>
<h2 style="text-align: center;">Conclusão</h2>
<p>Embora os dois métodos são bem simples eu, particularmente, gosto bastante de trabalhar com a Fluent API. Isto porque a adição de inúmeros atributos no nosso Model poluirá visualmente a nossa classe e tornará a leitura complicada. Além disso, com a Fluent API temos uma separação clara de responsabilidade entre o Model em si a sua configuração.<br />
Um outro ponto a se levar em consideração é que há algumas configurações que só podem ser alcançadas com a Fluent API, pois, o uso de atributos possui algumas limitações a serem levadas em consideração.</p>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2011/12/22/ef-code-first-data-annotations-x-fluent-api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tabela de Helper Methods mais comuns</title>
		<link>http://robsonramos.com/index.php/2011/09/23/tabela-de-helper-methods-mais-comuns/</link>
		<comments>http://robsonramos.com/index.php/2011/09/23/tabela-de-helper-methods-mais-comuns/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 03:33:36 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[Asp Net MVC]]></category>
		<category><![CDATA[Helper Methods]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=300</guid>
		<description><![CDATA[Helper Method Exemplo Output Html.BeginForm @using (Html.BeginForm(&#8220;Index&#8221;, &#8220;Home&#8221;)) &#60;form action=&#8221;/Home/Index&#8221; method=&#8221;post&#8221;&#62;&#60;/form&#62; Html.CheckBox Html.CheckBox(&#8220;myCheckbox&#8221;, false) &#60;input checked=&#8221;checked&#8221; id=&#8221;myCheckBox&#8221; name=&#8221;myCheckBox&#8221; type=&#8221;checkbox&#8221; value=&#8221;true&#8221; /&#62; Html.Hidden Html.Hidden(&#8220;myHidden&#8221;, &#8220;val&#8221;) &#60;input id=&#8221;myHidden&#8221; name=&#8221;myHidden&#8221; type=&#8221;hidden&#8221; value=&#8221;val&#8221; /&#62; Html.RadioButton Html.RadioButton(&#8220;myRadiobutton&#8221;, &#8220;val&#8221;, true) &#60;input checked=&#8221;checked&#8221; id=&#8221;myRadiobutton&#8221; name=&#8221;myRadiobutton&#8221; type=&#8221;radio&#8221; value=&#8221;val&#8221; /&#62; Html.Password Html.Password(&#8220;myPassword&#8221;, &#8220;val&#8221;) &#60;input id=&#8221;myPassword&#8221; name=&#8221;myPassword&#8221; type=&#8221;password&#8221; value=&#8221;val&#8221; /&#62; Html.TextArea Html.TextArea(&#8220;myTextarea&#8221;, &#8220;val&#8221;, 5, 20, [...]]]></description>
			<content:encoded><![CDATA[<table>
<tbody>
<tr>
<td><span style="color: #ff0000;"><strong>Helper Method</strong></span></td>
<td><strong><span style="color: #ff0000;">Exemplo</span></strong></td>
<td><span style="height: 180px;"><strong><span style="color: #ff0000;">Output</span></strong></span></td>
</tr>
<tr>
<td>Html.BeginForm</td>
<td>@using (Html.BeginForm(&#8220;Index&#8221;, &#8220;Home&#8221;))</td>
<td>&lt;form action=&#8221;/Home/Index&#8221; method=&#8221;post&#8221;&gt;&lt;/form&gt;</td>
</tr>
<tr>
<td>Html.CheckBox</td>
<td>Html.CheckBox(&#8220;myCheckbox&#8221;, false)</td>
<td>&lt;input checked=&#8221;checked&#8221; id=&#8221;myCheckBox&#8221; name=&#8221;myCheckBox&#8221; type=&#8221;checkbox&#8221; value=&#8221;true&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.Hidden</td>
<td>Html.Hidden(&#8220;myHidden&#8221;, &#8220;val&#8221;)</td>
<td>&lt;input id=&#8221;myHidden&#8221; name=&#8221;myHidden&#8221; type=&#8221;hidden&#8221; value=&#8221;val&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.RadioButton</td>
<td>Html.RadioButton(&#8220;myRadiobutton&#8221;, &#8220;val&#8221;, true)</td>
<td>&lt;input checked=&#8221;checked&#8221; id=&#8221;myRadiobutton&#8221; name=&#8221;myRadiobutton&#8221; type=&#8221;radio&#8221;<br />
value=&#8221;val&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.Password</td>
<td>Html.Password(&#8220;myPassword&#8221;, &#8220;val&#8221;)</td>
<td>&lt;input id=&#8221;myPassword&#8221; name=&#8221;myPassword&#8221; type=&#8221;password&#8221; value=&#8221;val&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.TextArea</td>
<td>Html.TextArea(&#8220;myTextarea&#8221;, &#8220;val&#8221;, 5, 20, null)</td>
<td>&lt;textarea cols=&#8221;20&#8243; id=&#8221;myTextarea&#8221; name=&#8221;myTextarea&#8221; rows=&#8221;5&#8243;&gt;val&lt;/textarea&gt;</td>
</tr>
<tr>
<td>Html.TextBox</td>
<td>Html.TextBox(&#8220;myTextbox&#8221;, &#8220;val&#8221;)</td>
<td>&lt;input id=&#8221;myTextbox&#8221; name=&#8221;myTextbox&#8221; type=&#8221;text&#8221; value=&#8221;val&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.CheckBoxFor</td>
<td>Html.CheckBoxFor(x =&gt; x.IsApproved)</td>
<td>&lt;input id=&#8221;IsApproved&#8221; name=&#8221;IsApproved&#8221; type=&#8221;checkbox&#8221; value=&#8221;true&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.HiddenFor</td>
<td>Html.HiddenFor(x =&gt; x.SomeProperty)</td>
<td>&lt;input id=&#8221;SomeProperty&#8221; name=&#8221;SomeProperty&#8221; type=&#8221;hidden&#8221; value=&#8221;value&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.RadioButtonFor</td>
<td>Html.RadioButtonFor(x =&gt; x.IsApproved, &#8220;val&#8221;)</td>
<td>&lt;input id=&#8221;IsApproved&#8221; name=&#8221;IsApproved&#8221; type=&#8221;radio&#8221; value=&#8221;val&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.PasswordFor</td>
<td>Html.PasswordFor(x =&gt; x.Password)</td>
<td>&lt;input id=&#8221;Password&#8221; name=&#8221;Password&#8221; type=&#8221;password&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.TextAreaFor</td>
<td>Html.TextAreaFor(x =&gt; x.Bio, 5, 20, new{})</td>
<td>&lt;textarea cols=&#8221;20&#8243; id=&#8221;Bio&#8221; name=&#8221;Bio&#8221; rows=&#8221;5&#8243;&gt;Bio value&lt;/textarea&gt;</td>
</tr>
<tr>
<td>Html.TextBoxFor</td>
<td>Html.TextBoxFor(x =&gt; x.Name)</td>
<td>&lt;input id=&#8221;Name&#8221; name=&#8221;Name&#8221; type=&#8221;text&#8221; value=&#8221;Name value&#8221; /&gt;</td>
</tr>
<tr>
<td>Html.DropDownList</td>
<td>Html.DropDownList(&#8220;myList&#8221;, new SelectList(new [] {&#8220;A&#8221;, &#8220;B&#8221;}), &#8220;Choose&#8221;)</td>
<td>&lt;select id=&#8221;myList&#8221; name=&#8221;myList&#8221;&gt;<br />
&lt;option value=&#8221;"&gt;Choose&lt;/option&gt;<br />
&lt;option&gt;A&lt;/option&gt;<br />
&lt;option&gt;B&lt;/option&gt;<br />
&lt;/select&gt;</td>
</tr>
<tr>
<td>Html.DropDownListFor</td>
<td>Html.DropDownListFor(x =&gt; x.Gender, new SelectList(new [] {&#8220;M&#8221;, &#8220;F&#8221;}))</td>
<td>&lt;select id=&#8221;Gender&#8221; name=&#8221;Gender&#8221;&gt;<br />
&lt;option&gt;M&lt;/option&gt;<br />
&lt;option&gt;F&lt;/option&gt;<br />
&lt;/select&gt;</td>
</tr>
<tr>
<td>Html.ListBox</td>
<td>Html.ListBox(&#8220;myList&#8221;, new MultiSelectList(new [] {&#8220;A&#8221;, &#8220;B&#8221;}))</td>
<td>&lt;select id=&#8221;myList&#8221; multiple=&#8221;multiple&#8221; name=&#8221;myList&#8221;&gt;<br />
&lt;option&gt;A&lt;/option&gt;<br />
&lt;option&gt;B&lt;/option&gt;<br />
&lt;/select&gt;</td>
</tr>
<tr>
<td>Html.ListBoxFor</td>
<td>Html.ListBoxFor(x =&gt; x.Vals, new MultiSelectList(new [] {&#8220;A&#8221;, &#8220;B&#8221;}))</td>
<td>&lt;select id=&#8221;Vals&#8221; multiple=&#8221;multiple&#8221; name=&#8221;Vals&#8221;&gt;<br />
&lt;option&gt;A&lt;/option&gt;<br />
&lt;option&gt;B&lt;/option&gt;<br />
&lt;/select&gt;</td>
</tr>
<tr>
<td>Url.Content</td>
<td>Url.Content(&#8220;~/my/content.pdf&#8221;)</td>
<td>/my/content.pdf</td>
</tr>
<tr>
<td>Html.ActionLink</td>
<td>Html.ActionLink(&#8220;Hi&#8221;, &#8220;About&#8221;, &#8220;Home&#8221;)</td>
<td>&lt;a href=&#8221;/Home/About&#8221;&gt;Hi&lt;/a&gt;</td>
</tr>
<tr>
<td>Url.Action</td>
<td>Url.Action(&#8220;About&#8221;, &#8220;Home&#8221;)</td>
<td>/Home/About</td>
</tr>
<tr>
<td>Html.RouteLink</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td>Html.RouteLink(&#8220;Hi&#8221;, new { controller = &#8220;c&#8221;, action = &#8220;a&#8221; }, null)</td>
<td>&lt;a href=&#8221;/c/a&#8221;&gt;Hi&lt;/a&gt;</td>
</tr>
<tr>
<td></td>
<td>Html.RouteLink(&#8220;Hi&#8221;, &#8220;myNamedRoute&#8221;, new {})</td>
<td>&lt;a href=&#8221;/url/for/named/route&#8221;&gt;Hi&lt;/a&gt;</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2011/09/23/tabela-de-helper-methods-mais-comuns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entendendo como o Razor renderiza Views</title>
		<link>http://robsonramos.com/index.php/2011/09/21/entendendo-como-o-razor-renderiza-views/</link>
		<comments>http://robsonramos.com/index.php/2011/09/21/entendendo-como-o-razor-renderiza-views/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 03:51:42 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[Asp Net MVC]]></category>
		<category><![CDATA[Razor]]></category>
		<category><![CDATA[Views]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=294</guid>
		<description><![CDATA[Neste artigo vamos tentar entender como o Razor efetua o processo de renderização das nossas Views à partir de uma request. Além disso, vamos ver como o nosso código C# escrito nas nossas views acaba sendo gerado por trás dos panos. Let’s Go! Só para contextualizarmos, o  Razor interpreta as nossas views somente quando o [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="Done" src="http://robsonramos.com/wp-content/uploads/2011/09/Razor.jpg" width="280" height="190"/></p>
<p>Neste artigo vamos tentar entender como o Razor efetua o processo de renderização das nossas Views à partir de uma request. Além disso, vamos ver como o nosso código C# escrito nas nossas views acaba sendo gerado por trás dos panos. Let’s Go!</p>
<p>Só para contextualizarmos, o  Razor interpreta as nossas views somente quando o nosso aplicativo é executado. A grande sacada por trás disso é que as nossas views são traduzidas para classes C#. Isso mesmo, escrevemos o nosso HTML e C# na View para no final ser gerada uma classe. Se pararmos para pensar, este é o motivo pelo qual podemos incluir trechos de código C# dentro das nossas views, pois, estes trechos de código acabarão sendo inseridos dentro de uma classe a ser gerada. Mais adiante veremos o que acontece com o HTML inserido na view também.</p>
<p>Vamos começar criando um projeto do tipo MVC3 com o template do tipo Empty. Após isso, adicione um Controller com o nome HomeController (ou qualquer outro nome à sua escolha) e em seguida adicione o trecho de código abaixo:</p>
<pre class="brush: csharp; title: ;">

public ActionResult Index()
{
     List&lt;string&gt; nomes = new List&lt;string&gt;{&quot;Robson&quot;, &quot;João&quot;, &quot;maria&quot;};

     return View(nomes);
}
</pre>
<p>O código acima não tem nada de especial, simplesmente cria uma coleção de strings com alguns nomes e passa esta coleção para a View. Após isso, vamos criar a nossa View selecionando a opção de view fortemente tipada e informando como model class uma List&lt;string&gt;, pois, estamos enviando para a nossa view uma coleção de strings. Veja abaixo:</p>
<p><img class="aligncenter" title="Done" src="http://robsonramos.com/wp-content/uploads/2011/09/CreateView.png" alt="" /></p>
<p>Com a view criada, adicione o código abaixo:</p>
<pre class="brush: xml; title: ;">

@model List&lt;string&gt;

@{ ViewBag.Title = &quot;Cadastro de Nomes&quot;; }

&lt;h2&gt;Nomes Informados&lt;/h2&gt;

&lt;ul&gt;

    @foreach (var nome in Model)
    {

        &lt;li&gt;@nome&lt;/li&gt;

    }
&lt;/ul&gt;
</pre>
<p>O código acima apenas recebe a lista de nomes e as exibe dentro de uma lista ul.</p>
<p>Agora vamos começar a analisar o que acontece durante este processo. Como dito anteriormente, todas as views são traduzidas para classes C# quando o nosso aplicativo é executado. Vamos então executar a nossa aplicação para que a nossa view seja traduzida para a sua respectiva classe. As classes geradas serão salvas no diretório (caso esteja usando o Windows 7):</p>
<p style="text-align: center;"><strong>C:\Users\&lt;Usuário&gt;\AppData\Local\Temp\Temporary ASP.NET Files\root</strong></p>
<p>Dentro desta pasta, temos que localizar o arquivo gerado. Mas, para localizá-lo devemos &#8220;fuçar&#8221; no conteúdo das pastas deste diretório, pois, o nome do arquivo não é nada intuitivo. Se for conveniente você pode parar a execução da aplicação, apagar todas as pastas dentro deste diretório e executar novamente a aplicação. Assim, será gerada apenas a pasta na qual contêm os códigos da nossa aplicação.</p>
<p>Depois de muito procurar, consegui localizar o arquivo gerado pelo Razor. O nome dele era  App_Web_xjjfolqg.1.cs (o seu arquivo pode conter um nome diferente!). Vamos então analisar o conteúdo deste arquivo:</p>
<pre class="brush: csharp; title: ;">
namespace ASP
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Web;
    using System.Web.Helpers;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.WebPages;
    using System.Web.Mvc;
    using System.Web.Mvc.Ajax;
    using System.Web.Mvc.Html;
    using System.Web.Routing;

    public class _Page_Views_Home_Index_cshtml : System.Web.Mvc.WebViewPage&lt;List&lt;string&gt;&gt;
    {

#line hidden

        public _Page_Views_Home_Index_cshtml()
        {
        }

        protected ASP.global_asax ApplicationInstance
        {
            get
            {
                return ((ASP.global_asax)(Context.ApplicationInstance));
            }
        }

        public override void Execute()
        {
            WriteLiteral(&quot;\r\n&quot;);

#line 3 &quot;C:\Users\Robson Ramos\Documents\Visual Studio 2010\Projects\LabMVC\RazorRender\Views\Home\Index.cshtml&quot;
            ViewBag.Title = &quot;Nomes Informados&quot;;

#line default
#line hidden

WriteLiteral(&quot;\r\n&lt;h2&gt;Lista de Nomes&lt;/h2&gt;\r\n\r\n&lt;ul&gt;\r\n\r\n&quot;);

#line 9 &quot;C:\Users\Robson Ramos\Documents\Visual Studio 2010\Projects\LabMVC\RazorRender\Views\Home\Index.cshtml&quot;

foreach (var nome in Model)
            {
#line default
#line hidden
                WriteLiteral(&quot;        &lt;li&gt;&quot;);

#line 12 &quot;C:\Users\Robson Ramos\Documents\Visual Studio 2010\Projects\LabMVC\RazorRender\Views\Home\Index.cshtml&quot;

Write(nome);

#line default
#line hidden
                WriteLiteral(&quot;&lt;/li&gt;         \r\n&quot;);

#line 13 &quot;C:\Users\Robson Ramos\Documents\Visual Studio 2010\Projects\LabMVC\RazorRender\Views\Home\Index.cshtml&quot;

            }

#line default
#line hidden
            WriteLiteral(&quot;&lt;/ul&gt;&quot;);

        }
    }
}
</pre>
<p>Eureka! Podemos observar que:</p>
<p>1 – A classe gerada deriva de System.Web.Mvc.WebViewPage&lt;List&lt;string&gt;&gt;, onde, List&lt;string&gt; é o nosso Model passado para a View. Se um Model de um tipo diferente fosse passado, o tipo informado seria para a classe System.Web.Mvc.WebViewPage. Assim, o MVC consegue mapear o tipo do Model passado para a View.</p>
<p>2 – A classe possui o nome de _Page_Views_Home_Index_cshtml. Perceba que o path da view gerou o nome da sua respectiva classe, pois, é assim que o Razor mapeia as requests para as instâncias das classes geradas.</p>
<p>3 – No método Execute, podemos perceber como os fragmentos de código Razor contidos na View foram gerados. O que o Razor faz na verdade (a grosso modo) é obter os trechos de códigos pré-fixados com o símbolo @ e expressá-los como declarações C#. Olha que interessante: é por isso que devemos usar o símbolo @ nas nossas Views, pois, o código C# gerado se baseia nisso. Com isso, cada código gerado possui um #line “nº da linha na nossa view” (observe no código acima).</p>
<p>4 – Os elementos HTML da nossa View (as nossas tags) são passadas para o método WriteLiteral, que internamente escreverá o conteúdo dentro de um TextWriter (sim, um TextWriter!). Já o método Write é usado para escrever o conteúdo da coleção (List<string>) no mesmo TextWriter. Assim, é feita a unificação do código C# e HTML.</p>
<p>Se você der uma fuçada a mais naquela pasta observará que há classes para as views _ViewStart e Error também. </p>
<p>Bom, agora o Razor não engana mais ninguém!  É bem legal entender como as coisas funcionam por trás do panos. Espero que tenham entendido e gostado. Por hoje é só pessoal!</p>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2011/09/21/entendendo-como-o-razor-renderiza-views/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Você possui uma definição de pronto?</title>
		<link>http://robsonramos.com/index.php/2011/07/24/voce-possui-uma-definicao-de-pronto/</link>
		<comments>http://robsonramos.com/index.php/2011/07/24/voce-possui-uma-definicao-de-pronto/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 14:11:01 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Definição de pronto]]></category>
		<category><![CDATA[Done]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=290</guid>
		<description><![CDATA[Esta semana eu estava falando com um amigo meu e ele estava me falando sobre diversos pontos durante o projeto no qual ele estava trabalhando que o incomodava. Entre os pontos citados um me chamou a atenção: trata-se da quantidade de trabalho necessário em diversas tarefas que já haviam sido feitas, o que acabava gerando [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="Done" src="http://robsonramos.com/wp-content/uploads/2011/07/Done.jpg" alt="" width="276" height="183" /></p>
<p>Esta semana eu estava falando com um amigo meu e ele estava me falando sobre diversos pontos durante o projeto no qual ele estava trabalhando que o incomodava. Entre os pontos citados um me chamou a atenção: trata-se da quantidade de trabalho necessário em diversas tarefas que já haviam sido feitas, o que acabava gerando trabalho remanescente para sprint após sprint. O que mais o incomodava era o fato de que este trabalho já havia sido dado como feito. Oras, se está feito está feito e não se fala mais nisso, certo? Será?!</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">Será que o que havia sido feito estava realmente feito?</h2>
<p>&nbsp;<br />
Vamos ser realistas. Não somos perfeitos. Quem nunca disse a famosa frase:</p>
<p style="text-align: center;">
<em>“A tarefa esta feita, só preciso fazer um pequeno ajuste.”</em></p>
<p>Será mesmo que este ajuste é realmente pequeno?<br />
Você tem noção exata de quanto tempo este pequeno ajuste custará para o projeto?</p>
<p>No final das contas, este “pequeno ajuste” acaba levando mais tempo do que a tarefa em si. Muitas vezes este pequeno ajuste é na verdade refazer a tarefa completamente. Alguns exemplos clássicos disso são: o código desenvolvido não esta com uma qualidade aceitável, uma refatoração necessária, escrita de testes (o código foi feito sem testes!), atualizar a documentação, correção de algum bug gerado durante a tarefa, subir para produção e etc.<br />
&nbsp;<br />
O caso acima é um típico cenário onde o time não definiu o significado de pronto. Agora pare e pense: O que para você significa dizer que uma tarefa está pronta? Alguns diriam que pode ser o somente a escrita de código, outros diriam código “commitado” no source control, já outros diriam que pronto é código passando em todos os testes.<br />
&nbsp;</p>
<h2 style="text-align: center;">
Ter uma definição de pronto é tão importante assim?</h2>
<p>&nbsp;<br />
Imagine a seguinte situação, um time se compromete a entregar uma quantidade de cenários sprint após sprint baseada na velocidade da sprint anterior. Com isso, na sprint anterior o time conseguiu entregar uma quantidade X de cenários e, portanto, na próxima sprint o time se comprometerá a entregar uma quantidade próxima à quantidade de cenários entregues anteriormente. Ao iniciar a sprint o time descobre que uma série de tarefas não estavam terminadas de fato, assim, para não “queimar o filme” com o product owner decidem que irão terminar todas estas tarefas e ainda entregar com o que se comprometeram.<br />
E o que acontece? O caos se instaura! Para entregar toda essa quantidade de trabalho impossível o time irá então abrir mão de um fator muito importante durante o projeto: a qualidade. Assim, bugs serão introduzidos na aplicação, dívidas técnicas que nunca serão pagas, a relação com os clientes será estremecida, desconfiança, fim da auto-organização e etc.<br />
&nbsp;<br />
Viu como um simples fator foi responsável por afundar o projeto. Será que a velocidade medida acima estava mesmo sendo medida da forma correta? Portanto, devemos ter conhecimento do que está sendo medido, pois, deve-se conhecer aquilo que se está medindo e o que aquilo significa para todos.<br />
Sendo assim, defina com o seu time o que a palavra pronto significa para todos, entrem em um consenso, chegue a uma definição que todos concordem, faça com que todos saibam que o pronto deve ter passado pelos passos X, Y ou Z e que o resultado gerado é de qualidade.<br />
&nbsp;<br />
Não se preocupe em achar a melhor definição do mundo sobre pronto, pois, o Scrum é processo adaptativo, se por acaso a definição de pronto não nos atende mais, então, simplesmente definimos outra que esteja dentro da nossa necessidade.<br />
&nbsp;<br />
Provavelmente depois disso, vocês chegarão a um consenso. O que pronto significa para nós? código escrito, testado, refatorado ,commitado&#8230;<br />
&nbsp;<br />
Só uma dica, você deve ser transparente SEMPRE. Isso mesmo, SEMPRE! Sua integridade e caráter deve valer muito mais do que tarefas e projetos. Muitos projetos falham pela falta de transparência. Ao invés de informar o cliente sobre o possível atraso muitos acabam acobertando os erros existentes pelo mal gerenciamento ou cronogramas impossíveis, portanto, não tenha vergonha de dizer você não conseguirá entregar uma determinada tarefa, afinal, é melhor dizer isso do que dizer: pronto, terminei!</p>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2011/07/24/voce-possui-uma-definicao-de-pronto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calendário no MVC com o Datepicker</title>
		<link>http://robsonramos.com/index.php/2011/07/21/calendario-no-mvc-com-o-datepicker/</link>
		<comments>http://robsonramos.com/index.php/2011/07/21/calendario-no-mvc-com-o-datepicker/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 12:59:54 +0000</pubDate>
		<dc:creator>Robson Ramos</dc:creator>
				<category><![CDATA[Asp Net MVC]]></category>
		<category><![CDATA[Calendario]]></category>
		<category><![CDATA[Datepicker]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://robsonramos.com/?p=269</guid>
		<description><![CDATA[Uma das necessidades ao mudar de WebForms para MVC é em como compensar a “falta” da quantidade de componentes disponibilizados pelo WebForms. Quando falamos em componentes, muitas pessoas (inclusive eu) já pensam no famoso componente calendar. &#160; A biblioteca JQuery UI &#160; Para compensar a “falta” de componentes, temos em mão um biblioteca muito poderosa [...]]]></description>
			<content:encoded><![CDATA[<p>Uma das necessidades ao mudar de WebForms para MVC é em como compensar a “falta” da quantidade de componentes disponibilizados pelo WebForms. Quando falamos em componentes, muitas pessoas (inclusive eu) já pensam no famoso componente calendar.</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">A biblioteca JQuery UI</h2>
<p>&nbsp;</p>
<p>Para compensar a “falta” de componentes, temos em mão um biblioteca muito poderosa chamada <strong>JQuery UI</strong> que permite que criemos interfaces poderosas, pois, ela estende as funcionalidades da biblioteca JQuery fornecendo componentes muito bonitos e fáceis de usar.</p>
<p>É uma biblioteca open source, ou seja, temos acesso ao modo como os componentes são criados e podemos customizá-los conforme a nossa necessidade. Lembrando que o Visual Studio fornece suporte intellisense para JavaScript, o que nos ajuda nessa tarefa.</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">Criando a aplicação</h2>
<p>&nbsp;</p>
<p>Crie então uma aplicação ASP NET MVC 3 com o nome de Calendar e selecione o Empty Template. Esta aplicação será bem simples, exibirá um formulário contendo apenas o nome e a data de nascimento para o usuário efetuar o seu cadastro. A seleção da data de nascimento será feita pelo componente de calendário da JQuery UI.</p>
<p>Por padrão as bibliotecas Jquery e Jquery UI já vêm inclusas nos projetos MVC, dentro da pasta Scripts. Conforme abaixo:</p>
<p>&nbsp;</p>
<p><img class="aligncenter" title="Visual Studio Project" src="http://robsonramos.com/wp-content/uploads/2011/07/1.png" alt="Visual Studio Project" width="350" height="400" /></p>
<p>&nbsp;</p>
<p>Caso você queira obter a última versão da JQuery UI, podemos efetuar o download no site: <a href="http://jqueryui.com/download" target="_blank">http://jqueryui.com/download</a>.</p>
<p>Vamos então criar a nossa classe pessoa, que deverá ser criada dentro da pasta Model do nosso projeto, conforme abaixo:</p>
<pre class="brush: csharp; title: ;">
namespace Calendar.Models
{
    public class Pessoa
    {
        [Required(ErrorMessage = &quot;O campo nome é obrigatório&quot;)]
        public string Nome  { get; set; }

        [Required(ErrorMessage = &quot;O campo data de nascimento é obrigatório&quot;)]
        [Display(Name = &quot;Data de Nascimento&quot;)]
        public DateTime DataDeNascimento { get; set; }
    }
}
</pre>
<p>Observe que estou usando Data Annotation para efetuar a validação dos dados.</p>
<p>Após isso, adicione um controller ao nosso projeto chamado CadastroController e selecione o template Empty controller, conforme abaixo:</p>
<p><img class="aligncenter" title="Adicionando um Controller" src="http://robsonramos.com/wp-content/uploads/2011/07/2.png" alt="Adicionando um Controller" /></p>
<p>Após o controller ser criado vamos criar os nossos Action Methods. Então, adicione o código abaixo:</p>
<pre class="brush: csharp; title: ;">
namespace Calendar.Controllers
{
    public class CadastroController : Controller
    {

        public ViewResult Cadastrar()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Cadastrar(Pessoa pessoa)
        {
            if (ModelState.IsValid)
            {
                // Persiste a pessoa no banco ....
                return RedirectToAction(&quot;CadastroEfetuado&quot;, pessoa);
            }
            return View();
        }

        public string CadastroEfetuado(Pessoa pessoa)
        {
            return string.Format(&quot;Obrigado por se cadastrar {0}, lembraremos do seu aniverário no dia {1}&quot;,
                                  pessoa.Nome, string.Format(&quot;{0:dd/MM}&quot;, pessoa.DataDeNascimento));
        }
    }
}
</pre>
<p>O código acima é bem simples, o método Cadastrar será chamado e a View que exibirá o formulário para o usuário. Após os dados serem preenchidos, o formulário será enviado para o servidor via POST, se tudo estiver preenchido corretamente, efetuamos então a chamada para o método CadastroEfetuado que apenas formata uma string para o usuário. Caso os dados preenchidos não estejam corretos, os erros serão exibidos para o usuário na tela de cadastro.</p>
<p>Após isso, precisamos criar a nossa View, então, clique com o botão direito sobre o método Cadastrar e clique em Add View e selecione a opção para criar uma View tipada. No campo Model class selecione a nossa classe pessoa. Conforme abaixo:</p>
<p>&nbsp;</p>
<p><img class="aligncenter" title="Adicionando uma View" src="http://robsonramos.com/wp-content/uploads/2011/07/3.png" alt="Adicionando uma View" /></p>
<p>&nbsp;</p>
<p>Com a view criada, adicione o código abaixo:</p>
<pre class="brush: csharp; title: ;">
@model Calendar.Models.Pessoa

@{
    ViewBag.Title = &quot;Cadastrar&quot;;
}

&lt;h2&gt;Cadastro de Pessoas&lt;/h2&gt;
&lt;script&gt;
    $(function () {
        $(&quot;#DataDeNascimento&quot;).datepicker();
    });
&lt;/script&gt;

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)

    &lt;div class=&quot;demo-description&quot;&gt;
        @Html.EditorForModel()
    &lt;/div&gt;

    &lt;p&gt;
        &lt;input type=&quot;submit&quot; value=&quot;Cadastrar&quot;/&gt;
    &lt;/p&gt;
}
</pre>
<p>Preste atenção nas tags script no código acima, ela será responsável por acionar o componente Datepicker do JQuery quando o usuário clicar no campo de texto. Além disso, definimos um validation summary para exibir os erros de validação para o usuário.</p>
<p><strong>Datepicker?</strong> Sim, o nome do componente de calendário do JQuery UI é Datepicker.</p>
<p>Assim, ao executar a aplicação e acessar o endereço <a>http://localhost:porta/cadastro/cadastrar</a> o formulário abaixo será exibido:</p>
<p><img class="aligncenter" title="Formulário" src="http://robsonramos.com/wp-content/uploads/2011/07/4.png" alt="Formulário" /></p>
<p>Mas, ao clicar no campo Data de Nascimento nada acontece!</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">Adicionando as referências</h2>
<p>&nbsp;</p>
<p>Nada aconteceu porque precisamos adicionar a referência para a biblioteca JQuery UI. Abra o arquivo _Layout.cshtml que está dentro da pasta Shared. É dentro deste arquivo que as nossas views são renderizadas, permitindo criar um layout uniforme para o nosso site.</p>
<p>Adicione a referência para a biblioteca JQuery UI e também a referência para o aquivo css que cuidará do estilo do nosso Datepicker:</p>
<pre class="brush: xml; title: ;">

&lt;script src=&quot;@Url.Content(&quot;~/Scripts/jquery-ui-1.8.11.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;

&lt;link href=&quot;@Url.Content(&quot;~/Content/themes/base/jquery.ui.datepicker.css&quot;)&quot; rel=&quot;stylesheet&quot;&gt;&lt;/link&gt;
</pre>
<p>&nbsp;</p>
<p>Após isso, execute a aplicação, acesse a Url mostada anteriormente e clique no campo Data de Nascimento.</p>
<p><img class="aligncenter" title="Formulário" src="http://robsonramos.com/wp-content/uploads/2011/07/5.png" alt="Formulário" /></p>
<p>O calendário é exibido e ao selecionar uma data o campo texto recebe a data selecionada. Caso você não goste do estilo do Datepicker, pode customizá-lo no site do Jquery UI e baixar a folha de estilo gerada, substituindo o arquivo css existente.</p>
<p>&nbsp;</p>
<h2 style="text-align: center;">Bug!</h2>
<p>&nbsp;<br />
Ao clicar no botão para submeter o formulário, um erro é exibido na tela:</p>
<p><img class="aligncenter" title="Formulário" src="http://robsonramos.com/wp-content/uploads/2011/07/6.png" alt="Formulário" /></p>
<p>Se você reparar, a data selecionada esta no formato mm/dd/yyyy e é isto que está gerando o erro, pois, o MVC tentará efetuar a conversão deste valor para DateTime e o erro acima será gerado.</p>
<p>Para corrigir o erro acima , basta modificar o formato da data do Datepicker. Então, substitua o script da view criado anteriormente para a versão abaixo:</p>
<pre class="brush: xml; title: ;">
&lt;script&gt;
    $(function () {
        $(&quot;#DataDeNascimento&quot;).datepicker({ dateFormat: 'dd/mm/yy' });
    });
&lt;/script&gt;
</pre>
<p>&nbsp;</p>
<p>Isso irá definir o formato da data. Para maiores detalhes em como customizar o Datepicker sugiro a leitura deste link: <a href="http://docs.jquery.com/UI/Datepicker/Localization" target="_blank">http://docs.jquery.com/UI/Datepicker/Localization</a></p>
<p>Sendo assim, execute a aplicação novamente e preencha os campos do formulário. Repare que agora o formato da data está correto:</p>
<p><img class="aligncenter" title="Formulário" src="http://robsonramos.com/wp-content/uploads/2011/07/7.png" alt="Formulário" /></p>
<p>Efetue o submit do formulário e a mensagem formatada pelo método CadastroEfetuado será exibida na tela. É importante ressaltar que a propriedade DataDeNascimento recebeu a data já convertida (DateTime) que foi selecionada no Datepicker, isto graças ao framework MVC.</p>
<p>Por hoje é só pessoal!</p>
]]></content:encoded>
			<wfw:commentRss>http://robsonramos.com/index.php/2011/07/21/calendario-no-mvc-com-o-datepicker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

