Entendendo o Model do ASP.Net MVC

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.
Solution Explorer

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.
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 :-)

Be Sociable, Share!

Deixe um comentario


OBS - Você pode usar estes atributos HTML e tags para formatar seus comentário:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">