Como prometi no último post Introdução ao ASP.Net MVC, que por sinal faz tempo que escrevi, pretendo dar continuidade ao assunto ASP.NET MVC e dessa vez falar um pouco do M de Model.
O que é o M de Model
O Model representa os dados da aplicação, ou seja, são objetos que armazenam as informações a serem transportados da camada inferior para e pela interface, dessa forma a camada de interface é desacoplada das demais camadas. É muito comum iniciantes confundirem model com objetos de domínio, inclusive já li esse erro em diversas literaturas, o que ajuda a tornar as coisas mais confusas.
Também não confunda arquitetura em camadas com MVC, pois a estruturação do MVC encontra-se somente na primeira camada.
Exemplificando
Criei um ASP.NET MVC Application chamado NewsletterApp. A idéia é criar nessa aplicação um cadastro de cliente, e exemplificar o conceito de Model.

Nessa estrutura criei uma classe Model chamada Customer.cs
public class Customer { public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } public bool IsActive { get; set; } }
Um controller chamado HomeController que possui três Action Methods, um Index() que irá renderizar a View Index.aspx, os outros dois CustomerRegistration, repare nos atributos AcceptVerbs isso irá permitir que as requisições do tipo Get sejam atribuídas ao primeiro Action Method CustomerRegistration e os submits do formulário (requisições do tipo Post) sejam atribuídas ao segundo.
public class HomeController : Controller { public ViewResult Index() { return View(); } [AcceptVerbs(HttpVerbs.Get)] public ViewResult CustomerRegistration() { return View(); } [AcceptVerbs(HttpVerbs.Post)] public ViewResult CustomerRegistration(Customer customer) { // TODO: executar o processo de cadastro do cliente // Neste ponto, é chamada para camada de negócio ou banco de dados return View("CustomerResponse", customer); } }
Observação: No último Action Method coloquei um comentário. Ele se refere ao local onde o poderia ser realizada a chamada para camada de negócio ou banco de dados, para o cadastramento dos dados do cliente. Como o foco desse post não é o desenvolvimento desse processo. Optei em utilizar um comentário para exemplificar.
E duas páginas Index.aspx que é a nossa Startup Page. nela constem somente uma ancora (tag a) para a página CustomerRegistration.aspx que executa o processo de cadastro.
<p>< %= Html.ActionLink("Cadastro Cliente", "CustomerRegistration") %></p>E CustomerRegistration.aspx que possui um formulário com um input type=”submit”, para enviar os dados do cliente para a Action de destino do Form.
<h1>Cliente</h1> <fieldset> < % using(Html.BeginForm()) { %> <p>Nome:</p> <p>< %= Html.TextBox("Name") %></p> <p>Email:</p> <p>< %= Html.TextBox("Email")%></p> <p>Telefone:</p> <p>< %= Html.TextBox("Phone")%></p> <p>Ativo: < %= Html.DropDownList("IsActive", new[] { new SelectListItem { Text = "Sim",Value = bool.TrueString }, new SelectListItem { Text = "Não",Value = bool.FalseString }}) %> </p> <input type="submit" value="Salvar" /> < % } %> </fieldset>
Agora vamos criar mais uma página para a resposta do cadastramento.
Para isso basta clicar com o botão direito sobre o diretório Home > Add > View. Informamos o nome da página, no exemplo utilizei CustomerResponse.
E selecionamos a opção Create a strongly-typed view.

E inclui o seguinte código na página.
1 2 3 4 5 6 7 8 9 | <h1>Obrigado!</h1> <p>< %= Html.Encode(Model.Name) %> foi cadastrado com sucesso.</p> <p>Seu status é < % if (Model.IsActive == true){ %> ativo. < % }else{ %> inativo. < % } %> </p> |
Neste momento você deve estar se perguntando como algumas algumas coisas acontecem?
É agora que entra a mágica do MVC.
Model Binding
Na HomeController a primeira Action Method de CustomerRegistration simplismente renderiza a View, porém a segunda recebe uma instância de Customer como um parâmetro.
A pergunta aqui é como um método é invoca via HTTP request passando um tipo .NET como parâmetro se ele é totalmente desconhecido do HTTP?
Simples… Chama-se Model Binding. O ASP.NET MVC automaticamente instância e converte os parâmetros por meio de chave/valor que tenham os mesmos nomes das propriedades do tipo .NET utilizado como parâmetro no Action Method.
Repare que os nomes dos elementos text do formulário possuem o mesmo nome dos atributos da classe Customer.
Outra característica apresentada pela segunda Action é a especificação da View que irá ser renderizada, e definição do objeto Model que será passado para View, esse View é chamado de strongly typed view, pois está fortemente tipada com um objeto da aplicação.
Esta view permite que seja acessada a variável chamada Model que esta relacionada ao tipo da criação da página no caso do exemplo o objeto Customer.
Conclusão
Gostei muito da arquitetura MVC por permite uma melhor separação de responsabilidade dos componentes de interface. Como por exemplo a separação de Actions para Get E Post. O encapsulamento de parâmetro em instância de objetos reduz a escrita de código.
A utilização de objetos Model na aplicação ficou mais presente, e sua interação com outros instâncias passa a ser mais requerida.
Até mais
Enjoy
