MVC

Validação em aplicações web

0

Pessoal, com o tempo eu venho testando diferentes maneiras de realizar validação dos dados para determinada execução de um método de negócio ou funcionalidade semelhante. Em projetos anteriores ao asp.net mvc u já passei pelos seguintes modelos:

 

Validação apenas no client side
Este modelo é inviável para uma aplicação enterprise, pois toda a regra de execução está no layout, se uma nova interface fosse criada regras teriam que ser copiadas e adicionadas ao novo projeto. Com o tempo aprendi que a validação client-side(app web) é apenas para melhorar a interação do cliente com a aplicação e que uma validação no lado servidor é necessária para segurança da aplicação.

Validação client-side e server side
Desta maneira temos a validação client-side para melhorar a interface com o usuário e ainda temos a validação do lado servidor capaz de validar a execução. Neste modelo a validação server side pode ser reaproveitada em outros projetos de interface. No entanto já tive problemas com duplicação de código de validação que era difícil de manter.

Validação client-side e server side *(usando façades)
Usando o último modelo decidi por criar uma camada de validação usando um Validation facade, tentando assim isolar código de validação da minha regra de negócio efetivamente. Cheguei a usar com sucesso o modelo de validação até que chegou a integração asp.net mvc+ data annotations

Validação usando Data annotations(client side e server side)
Usando data annotations é possível manter informações de validação na propria entidade(classe) e ainda reaproveitar o código tanto para client-side  e server side. Ai tudo parecia perfeito! mas e quando eu criar um novo projeto de interface sem suporte ao data annotations? deveria escrever um código para funcionar com data annotations em outra interface como uma app WCF. então..

Validação usando Data annotations+ enterprise library 5.0
A versão 5.0 do enterprise library tem suporte ao data annotations, então agora poderia reaproveitar o data annotations para projetos mvc usando a estrutura que já existe e ainda poderia usar data annotations em outras interfaces através do entlib e ter a mesma qualidade /padrão de informar dados inválidos(nome do campo+mensagem). E se quiser poderia usar a validação do mvc com o entlib.

Novo modelo proposto com Data annotations + enterprise library 5.0 + code contracts
Estou na fase de definição do modelo de validação de um novo projeto, estou pensando em adotar o último modelo adotado quando estiver trabalhando com métodos que recebem entidades como parâmetros que podem ser validadas. Nos casos de métodos que apenas recebem parâmetros vou usar code contracts para definir e alertar quais validações devem ser realizadas para a execução ocorrer com sucesso.

Questões sobre o modelo proposto

Eu ainda estou estudando algumas opções neste modelo, o que fazer por exemplo quando o usuário passa uma  id que deveria ser da tabela pessoa e o ID não existe? a interface de usuário deveria possibilitar a seleção correta do id? como o negócio deveria se comportar? lançando uma exceção?

EF4 POCO + Data Annotations + ASP.NET MVC 2.0

0

Olá pessoal, nos ultimos posts andei falando bastando sobre o Entity Framework 4 CTP2. Estou realmente empolgado com a galera do EF e a API Code-Only. Eu sempre achei a idéia de usar data annotations muito legal, ainda mais depois que vi como a coisa funciona muito bem com o ASP.NET MVC.

O ASP.NET MVC possui uma integração que possibilita a validação client-side e server-side de uma maneira bem facil. Eu sempre usei LINQ e EF nos meus projetos, sempre com a ferramenta de geração automática de entidades estas ferramentas de geração de código dificultam o trabalho de quem quer usar data annotations. Agora com a API Code-Only tudo se encaixa perfeitamente! estou pensando em mudar a infra do meu projeto e utilizar EF4 POCO+Data annotations+MVC 2. Vamos ver um exemplo de como as coisas funcionam, vou exibir apenas a integração, você pode obter a solução completa no link de download no final do post.

 

   1: public class Contact

   2: {

   3:     public int ContactID { get; set; }

   4:     

   5:     [Required(ErrorMessage="O nome deve ser preenchido"), StringLength(100)]

   6:     public String Name { get; set; }

   7:     

   8:     [Required(ErrorMessage="O e-mail deve ser preenchido")]

   9:     public String Email { get; set; }

  10:     

  11:     public String Phone { get; set; }

  12: }

Classe code-only com as configurações usando Data annotations

 

 

   1: [AcceptVerbs(HttpVerbs.Post)]

   2: public ActionResult Create([Bind(Exclude = "ID")] Contact contact)

   3: {

   4:     try

   5:     {

   6:         

   7:         if (!ModelState.IsValid)

   8:             return View();

   9:   

  10:  

  11:         return RedirectToAction("Index");

  12:     }

  13:     catch

  14:     {

  15:         return View();

  16:     }

  17: }

Ação responsável pela criação
 
 
 
 
   1: public ActionResult Create([Bind(Exclude = "ID")] Contact contact)

Estamos falando que ID não precisa ser carregado.

 

 

O código abaixo é o código da view create.

<%@ Import Namespace="DataLayer.Entities" %>

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<DataLayer.Entities.Contact>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">    Create</asp:Content><asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">    <script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
   1:  

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

   1: </script>

   2:     <script src="../../Scripts/MicrosoftMvcJQueryValidation.js" type="text/javascript">

</script>
<h2>
Contato</h2>
<%

   1:  Html.EnableClientValidation(); 

%>
<%

   1: = Html.ValidationSummary() 

%>
<%

   1:  using (Html.BeginForm())

   2:        {

%>
<%

   1: =Html.EditorForModel() 

%>
<p>
<input type="submit" value="Save" />
</p>
<%

   1:  } 

%>
<div>
<%

   1: =Html.ActionLink("Back to List", "Index") 

%>
</div>
</asp:Content>

 

A validação client-side está na seguinte parte:

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

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

   1: </script>

   2:   <script src="../../Scripts/MicrosoftMvcJQueryValidation.js" type="text/javascript">

</script>

 

<%
   1:  Html.EnableClientValidation(); 

%>

 

A integração é muito simples! o código completo está abaixo

 

código fonte

Não existe nada mais facil que o novo ASP.NET MVCThere isn’t anything easier than the new ASP.NET MVC

0

Olá pessoal,

Eu estou brincando no asp.net mvc desde o preview 6 dele, como você pode ver há muitas pessoas tentando melhorar a qualidade do software através do MVC. Eu posso dizer que minha experiência com esta tecnologia está sendo legal.

A questão desse post, é que como qualquer nova tecnologia há muitos iniciantes tentando, com isso essas pessoas não tem cuidado sobre padrões e melhores práticas, assim provavelmente elas estão fazendo o mesmo que elas fariam com webforms.

O engano mais comum é causado pela incompreensão dos conceitos básicos do MVC, onde pessoas ainda entendem que o MVC é como:

M – Significa o lugar onde você coloca seus modelos, dados ou coisas relacionadas;

V – Seu código html, a interface com o usuário;

C – Todos os códigos que fazem a aplicação rodar.

Eu estava tendo uma conversa com um meu e ele disse que coloca a regra de negócio dele dentro do controller. Eu sugeri a ele colocar o código em um outro projeto e usar o controller apenas para gerenciar requisições e questões relacionadas. Ele disse que faria isso mas onde iria colocar os dados dele? Eu acho que em outro projeto também. Neste modo ele acaba apenas adicionando referência para o negócio e o projeto de dados dentro do projeto web dele.

Todo esse texto foi apenas um exemplo. Eu estou preocupado sobre como as pessoas tendem a usar o MVC, em uma mão há muitas pessoas gastando tempo sugerindo melhores práticas mas na outra há pessoas que não se importam com isso.
Eu li em um post de alguém que disse:

“Não é suficiente construir aplicações sobre os padrões, você ainda poderá fazê-las pobres e fracas.”

Ps.: Eu sei que eu posso melhorar meus projetos MVC. Eu também sou uma dessas pessoas descritas


Olá pessoal,

Eu estou brincando no asp.net mvc desde o preview 6 dele, como você pode ver há muitas pessoas tentando melhorar a qualidade do software através do MVC. Eu posso dizer que minha experiência com esta tecnologia está sendo legal.

A questão desse post, é que como qualquer nova tecnologia há muitos iniciantes tentando, com isso essas pessoas não tem cuidado sobre padrões e melhores práticas, assim provavelmente elas estão fazendo o mesmo que elas fariam com webforms.

O engano mais comum é causado pela incompreensão dos conceitos básicos do MVC, onde pessoas ainda entendem que o MVC é como:

M – Significa o lugar onde você coloca seus modelos, dados ou coisas relacionadas;

V – Seu código html, a interface com o usuário;

C – Todos os códigos que fazem a aplicação rodar.

Eu estava tendo uma conversa com um meu e ele disse que coloca a regra de negócio dele dentro do controller. Eu sugeri a ele colocar o código em um outro projeto e usar o controller apenas para gerenciar requisições e questões relacionadas. Ele disse que faria isso mas onde iria colocar os dados dele? Eu acho que em outro projeto também. Neste modo ele acaba apenas adicionando referência para o negócio e o projeto de dados dentro do projeto web dele.

Todo esse texto foi apenas um exemplo. Eu estou preocupado sobre como as pessoas tendem a usar o MVC, em uma mão há muitas pessoas gastando tempo sugerindo melhores práticas mas na outra há pessoas que não se importam com isso.
Eu li em um post de alguém que disse:

“Não é suficiente construir aplicações sobre os padrões, você ainda poderá fazê-las pobres e fracas.”

Ps.: Eu sei que eu posso melhorar meus projetos MVC. Eu também sou uma dessas pessoas descritas

Nunit, usando SetUp e teardown

0

Fala galera,

Desculpe pela ausência nas ultimas duas semanas, eu gastei grande parte do tempo configurando meu novo PC com o Windows 7 além de estudar para as provas da faculdade.Hoje vamos falar de um assunto que deveria ser debatido mais vezes nos blogs e grupos de discussão, estou falando dos testes unitários.Estou trabalhando num projeto com ASP.NET MVC, como você pode imaginar estou utilizando testes unitários(MVC+Testes unitários = agilidade). Eu estou usando um FakeController que pode ser obtido no blog do Stephen Walther. O código fornecido trabalha com um método SetUp  que inicializa o FakeControllerContext no controller que está sendo testado. O método SetUp no NUnit é disparado antes da execução de cada teste, então a cada novo teste um novo FakeControllerContext é criado.Até ai não existe problema, A situação fica complicada quando é necessário compartilhar dados entre testes distintos usando como exemplo o objeto applicationContext.Para resolver este problema  você precisa realizar apenas uma pequena alteração no método setUp, as mesmas mudanças explicadas para o SetUp são validas. Vamos olhar um exemplo que deixa a ordem de execução mais clara.

   1: [TestFixtureSetUp]

   2:     public void ClassSetUp()

   3:     {

   4:         //A lista de produtos e o gerente de produtos podem ser utilizados para todos os métodos

   5:         // sendo assim, não é necessário inicializar os membros antes de cada método

   6:         gerenteProduto = new GerenteProdutos();

   7:         produtos = new List<Produto>();

   8:         produtos.Add(new Produto() { Nome = "Iphone", Preco = 300 });

   9:         produtos.Add(new Produto() { Nome = "PSP", Preco = 180 });

  10:         produtos.Add(new Produto() { Nome = "VSTS", Preco = 500 });

  11:

  12:

  13:

  14:     }

  15:     [SetUp]

  16:     public void SetUp()

  17:     {

  18:         // esta variável deve ser inicializada antes de cada execução - exemplo simples para explicação

  19:         ssomatorio = 0;

  20:     }

  21:

  22:     [Test]

  23:     public void TestSomaValorDosProdutos()

  24:     {

  25:         ssomatorio = gerenteProduto.SomaValorDosProdutos(produtos);

  26:         Assert.AreEqual(980, ssomatorio);

  27:     }

  28:

  29:     [Test]

  30:     public void TestSomatorioDosProdutosComTaxas()

  31:     {

  32:         ssomatorio = gerenteProduto.SomatorioDosProdutosComTaxas(produtos);

  33:         Assert.AreEqual(1078, ssomatorio);

  34:     }

Como você pode ver no exemplo o atributo [TestFixtureSetUp] indica que um método será executado apenas uma vez, durante a inicialização da classe. O atributo [SetUp] indica que um método será executa antes de cada teste.

Espero que você escreva muitos testes e que os atributos SetUp e TearDown sejam úteis.

código fonte completoHello folks,

Sorry for being absent the last two weeks, I spent so much time configuring my new PC and the windows 7 besides being studying for college exams. Today let’s talk about a subject that I think that should be discussed, this post talks about NUnit and some tips for this tool. I’m working on an ASP.NET MVC project, so you can realize that I’m working with Unit tests, if you do you are right. I’ve been using a fakeController context to test the UI layer. You can get this code at Stephen Walther’s blog.  In this code you have a setup method that sets the fakecontext in the current controller. The setup method in NUnit is called before each test runs, so each new test uses a new fakeContext, there is no problem in this approach. The situation gets worse when you want to test values stored in the applicationContext, for instance if you need to test the session[“index”], To solve this issue you just have to make a little change in your SetUp method, you should execute it before each class Am I right? So if you agree you just have to change the attribute setup to TestFixtureSetUp, you can make the same change to TearDown. Let’s look an example that show what is the execution order in Nunit.

   1: [TestFixtureSetUp]

   2:    public void ClassSetUp()

   3:    {

   4:

   5:        //the listOfProduct and the ProductManager are available for all methods, so they don't need

   6:        //to be initialed before each method execution

   7:        productManager = new ProductManager();

   8:        productNames = new List<Product>();

   9:        productNames.Add(new Product() { Name = "Iphone", Price = 300 });

  10:        productNames.Add(new Product() { Name = "PSP", Price = 180 });

  11:        productNames.Add(new Product() { Name = "VSTS", Price = 500 });

  12:

  13:

  14:

  15:    }

  16:    [SetUp]

  17:    public void SetUp()

  18:    {

  19:        // the variable sum must be initialed before each method -poor example just to show the execution

  20:        sum = 0;

  21:    }

  22:

  23:    [Test]

  24:    public void TestSumOfAllProducts()

  25:    {

  26:        sum = productManager.SumProductsValues(productNames);

  27:        Assert.AreEqual(980, sum);

  28:    }

  29:

  30:    [Test]

  31:    public void TestSumOfAllProductsWithTaxes()

  32:    {

  33:        sum = productManager.SumProductsValuesWithTaxes(productNames);

  34:        Assert.AreEqual(1078, sum);

  35:    }

You can see in the example that the attribute [TestFixtureSetUp] indicates that a method will execute before the class and the attribute [SetUp] indicates that a method will execute before each test runs. You can do the same thing when working with tearDown.

I hope you write tests and that setUp and TearDown methods help you!

Full source code

ASP.NET MVC 2 Preview 1

0

Fala Galera, é verdade! estava vendo um video agora do phill haack falando sobre o preview 1 do mvc 2. Ainda não sei todas as novidades, vou ler e experimentar e posto aqui o que achar interessante.. Segue umas fontes:

http://haacked.com/archive/2009/07/30/asp.net-mvc-released.aspx

http://aspnet.codeplex.com/Wiki/View.aspx?title=Road%20Map&referringTitle=Home

http://go.microsoft.com/fwlink/?LinkID=154411

http://channel9.msdn.com/posts/Glucose/Hanselminutes-on-9-ASPNET-MVC-2-Preview-1-with-Phil-Haack-and-Virtual-Scott/

http://www.microsoft.com/downloads/details.aspx?FamilyID=d34f9eaa-fcbe-4e20-b2fd-a9a03de7d6dd&displaylang=en

Testes unitários ASP.NET MVC

0

Fala Galera, ontem estava trabalhando em um dos meus projetos pessoais e me encontrei meio perdido, fiquei uns 10 minutos debuggando.. isso porque? bem neste projeto desenvolvemos usando testes unitários, testes são realmente uma ferramente essencial quando estamos falando de refatorações ou até mudanças comportamentais no código.

Eu participo de um grupo de arquitetura que está rolando uma thread sobre testes unitários, acho que a principal pergunta quando falamos de testes é sobre como vamos escrever testes, que comportamentos devemos testar.. Eu já pesquisei bastante sobre testes unitários e achei poucas dicas sobre como escrever testes, depois de um tempo aprendi que este conhecimento é obtido praticando! sim, praticando!

Meu início com os testes unitários não foi facil, eu escrevia testes me baseando no comportamento default esperado com o uso da função testada, acho que no início está é uma maneira eficiente de escrever testes. Depoisde um tempo vi que testes podem fazer mais, podem validar contratos definidos pelos métodos, sendo assim comecei a testar condições comuns que poderiam fazer o método quebrar, foi então que aprendi que testes podem esperar uma exceção.Hoje eu uso testes de maneira muito mais eficiente se comparado quando comecei, e olha que isso tem mais ou menos 1 ano.

Como foi dito no início do post, eu uso testes unitários no meu projeto. Este projeto usa ASP.NET MVC,  no MVC é realmente muito mais facil de testar a execução das  páginas pois na verdade testamos os controller(no WebForm é  melhor usar o selenium).  No ASP.NET MVC, é necessário usar objetos Fake para testar os controller de maneira simples, código para fazer é simples e já foi desenvolvido pelo stephenwalther. O código pode ser acessado aqui no meu projeto(Test->WebUI->FakeObjects), nesta pasta estão os arquivos necessários e aqui um exemplo de uso.

É isso galera, espero que a dica seja boa.. uma maneira facil de testar usando asp.net mvc

Using MVC without installation

0

    Hi people, I know I have to blog more. I tell you that the last week was really good. I think I already said that my coworkers and I started to write UI tests, I learnt to solve some problems using selenium and others tools. I will blog about it last week. As well the Carnival is coming, so I can say that I am preparing to it.

   I’m starting a new project called comperio. this project is hosted in goodady. I took a cheap plan, I tried to use one ASP.NET MVC application but I had some errors with MVC’s DLLs. I had gave up the idea of use MVC because I can’t run it. Last Sunday I came up with some ideas. I thought if I put this DLL’s in an accessible folder I could redirect my project references to this folder. I did it and it Worked! yeah!! I’m very happy in use MVC, because last week I saw the MVC Release candidate and the final version will come next month so we have to use it.

see you!

Go to Top