Iniciando com ASP.Net MVC 3 (Parte 3)


<< Anterior

Adicionando uma View


Neste tutorial você irá modificar a classe HelloWorldController para utilizar o arquivo modelo View para limpar o encapsulamento do processo de geração de resposta HTML para o cliente.

Você criará um arquivo do modelo view utilizando o Razor View Engine introduzido com o ASP.NET MVC 3. O modelo baseado no Razor view tem a extensão do arquivo como .cshtml, e provê uma maneira elegante para criar saída HTML utilizando o C#. Razor minimiza o número de caracteres e o número de digitação requeridos quando se está construindo um template view, e habilita um fluxo de trabalho de codificação rápido e com fluidez.

Inicie utilizando um template com o método Index na classe HelloWorldController. Atualmente o método Index retorna uma string com uma mensagem que é hard-coded na classe controller. Altere o método Index para retornar um objeto View, como mostrado a seguir:

public ActionResult Index() { 
    return View(); }

Este código utiliza o modelo View para gerar uma resposta HTML para o navegador. No projeto, adicione um modelo View que você pode utilizar com o método Index. Para fazer isto, clique com o botão direito dentro do método Index  e clique em Add View.




A caixa de diálogo Add View aparecerá. Deixe as seleções padrões da maneira que estão e clique no botão Add.



A pasta MvcMovie\Views\HelloWorld e o arquivo MvcMovie\Views\HelloWorld\Index.cshtml são criados. Você pode vê-los no Solution Explorer.



A seguir é exibido o arquivo Index.cshtml que foi criado:

HelloWorldIndex

Adicione algum código HTML como a tag <h2>. A modificação do arquivo MvcMovie\Views\HelloWorld\Index.cshtml é mostrado a seguir:


@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>Hello from our View Template!</p>

Execute a aplicação e navegue para o controller HelloWorld (http://localhost:xxxx/HelloWorld). O método Index  no seu controller não faz muita coisa; ele simplesmente executa a declaração  return View(), o qual específica que o método deverá usar um arquivo do modelo view para transmitir uma resposta para o navegador. Como você não especificou o nome do arquivo modelo view a ser usado, ASP.NET MVC por padrão utiliza o arquivo view Index.cshtml na pasta \Views\HelloWorld. A imagem abaixo exibe a string hard-coded no view.





Parece muito bom.  No entanto, observe que a barra de título do navegador exibe "Index" e o grande título na página exibe "My MVC Application". Vamos alterar isto.


Alterando Views e a exibição da página 

Primeiro, você procure alterar o título "My MVC Application" no topo da página. Aquele texto é comum para todas as páginas. Atualmente ele é implementado somente em um lugar no projeto, apesar de aparecer em todas as páginas na aplicação. Vá para o diretório \Views\Shared na Solution Explorer e abra o arquivo _Layout.cshtml. Este arquivo é chamado por uma página de exibição e ele compartilha o conteúdo que outras páginas utilizam.


_LayoutCshtml


O modelo de layout permite que você o conteúdo HTML do layout do seu site em um lugar e então ele é aplicado através de múltiplas páginas no seu site. Observe a linha  @RenderBody() próximo à parte de baixo do arquivo. RenderBody  é um placeholder onde todas as especificações visuais da página que você criou são mostradas, "dentro" do layout da página. Altere o título do cabeçalho no modelo do layout de "My MVC Application" para "MVC Movie App".


   <div id="title">
      <h1>MVC Movie App</h1>
  </div>
Execute a aplicação novamente e note que agora é exibido "MVC Movie App". Clique no link About, e veja como está página também exibe "MVC Movie App" também. Fomos capazes de alterar o layout do site em um único lugar e ter o novo título refletido em todo o site.



O arquivo _Layout.cshtml completo é exibido abaixo:



<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
</head>
<body>
    <div class="page">
        <header>
            <div id="title">
                <h1>MVC Movie App</h1>
            </div>
            <div id="logindisplay">
                @Html.Partial("_LogOnPartial")
            </div>
            <nav>
                <ul id="menu">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                </ul>
            </nav>
        </header>
        <section id="main">
            @RenderBody()
        </section>
        <footer>
        </footer>
    </div>
</body>
</html>

Agora, vamos alterar o título da página principal (view)


Abra o arquivo MvcMovie\Views\HelloWorld.cshtml. Existem dois locais para fazer a alteração: primeiro, o texto que aparece no título do navegador, e então o cabeçalho secundário (a tag <h2>). Você vai torná-los um pouco diferente, assim você poderá ver em qual pedaço do código alterado como parte da aplicação.

@{
    ViewBag.Title = "Movie List";
}
<h2>My Movie List</h2>
<p>Hello from our View Template!</p>

Para indicar o título HTML para exibir, o código acima define uma propriedade  Title   do objeto ViewBag (o qual está no modelo view index.cshtm). Se você olhar o fonte do código anterior do modelo do layout, você notará que o modelo utiliza este valor no elemento <title> como parte da seção <head> do HTML. Usando esta abordagem você pode facilmente passar outros parâmetros entre seus modelos view e seu arquivo de layout.


Execute a aplicação e navegue para http://localhost:xxxx/HelloWorld. Note que o título do navegador, o primeiro e o segundo cabeçalho foram alterados. (Se você não viu as alterações no browser, você pode estar vendo o conteúdo do cache do navegador. Pressione CTRL + F5 no seu navegador para forçar a resposta do servidor para ser carregada.)


Note também como o conteúdo do modelo view index.cshtml foi fundido com o modelo view _Layout.cshtml e uma simples resposta HTML foi enviada para o navegador. Modelos de layout fazem isso realmente fácil, para fazer mudanças que serão aplicadas dentro de todas as páginas na sua aplicação.




Embora nossa pequena parte de "dados" (Neste caso a mensagem "Hello from our View Template!") seja hard-coded. A aplicação MVC tem um "V" (View) e também um "C" (Controller), mas não um "M" (Model) ainda. Logo, nós iremos aprender como criar um banco de dados e recuperar dados da camada Model.

Passando Dados do Controller para o View

Antes de ir para um banco de dados e falar sobre modelos, vamos primeiramente falar sobre a passagem de informação de um controller para um view. Classes controller são invocadas em resposta à solicitações de requisições de URL. Uma classe controller é onde você escreve o código que manipulará a entrada de parâmetros, recuperando dados de um banco, e por último, decidindo qual tipo de resposta será enviada de volta para o navegador. Modelos View podem então serem usados de um controller para gerar e formatar uma resposta HTML para o navegador.

Controller são responsáveis por prover tudo o que dados ou objetos estão requisitando na ordem para um modelo view para fazer uma resposta para o navegador. Um modelo view nunca poderá realizar a lógica de negócios ou interagi com um banco de dados diretamente. Em vez disso, deverá trabalhar somente com os dados que são providos para ele pelo controller. A manutenção deste "conceito de separação" ajuda a manter seu código limpo e mais  fácil para dar manutenção.

Atualmente o método de ação Welcome na classe HelloWorldController recebe com parâmetro name e numTimes e então os valores são exibidos diretamente para o browser. Ao invés do controller ter de retornar esta resposta como uma string, em vez disso, vamos alterar o controller para usar um modelo view. O modelo view irá gerar uma resposta dinamicamente, o que significa que você precisa passar pedaços apropriados de dados do controller para a view na ordem de geração da resposta. Você pode realizar isso fazendo com que o controller coloque os dados dinâmicos que o modelo view precisa em um objeto ViewBag que o modelo view pode acessar.

Retorne para o arquivo HelloWorldController.cs e altere o método Welcome para adicionar os valores de Message e  NumTimes para o objeto ViewBagViewBag é um objeto dinâmico, o que significa que você pode colocar o que quiser dentro dele; o objeto ViewBag tem propriedades não definidas até você colocar algo dentro delas. O arquivo completo HelloWorldController.cs ficará como este:

using System.Web;
using System.Web.Mvc;
namespace MvcMovie.Controllers
{
    public class HelloWorldController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Welcome(string name, int numTimes = 1)
        {
            ViewBag.Message = "Hello " + name;
            ViewBag.NumTimes = numTimes;

            return View();
        }
    }
}
Agora o objeto ViewBag contém dados que serão passados para a view automaticamente.

Em seguida, você precisa de um modelo view de boas vindas. No menu Debug, selecione Build MvcMovie para ter certeza que o projeto foi compilado.

BuildHelloWorld

Então clique com o botão direito dentro do método Welcome e clique  em Add View. Aqui está o que a caixa de diálogo Add View mostrará:



Clique em Add, e então adicione o seguinte código abaixo da tag <h2> no novo arquivo Welcome.cshtml. Você vai criar um loop que diz "Hello" quantas vezes o usuário solicitar. O arquivo completo Welcome.cshtml é exibido abaixo:


@{
    ViewBag.Title = "Welcome";
}
<h2>Welcome</h2>
<ul> 
   @for (int i=0; i < ViewBag.NumTimes; i++) { 
      <li>@ViewBag.Message</li> 
   } </ul>

Execute a aplicação e navegue para a seguinte URL:
http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4

Agora o dado é recuperado da URL e passado para o controller automaticamente. O controller empacota o dado dentro do objeto ViewBag e passa o objeto para a view. O view então exibe o dado como código HTML para o usuário.

Bem, esse foi um tipo de "M" para model, mas não um tipo de banco de dados. Vamos usar o que aprendemos e criar um banco de dados de filmes.
































2 comentários:

  1. Excelente esse BLOG.. Parabéns..
    Estou vindo do Webforms e não conseguia entender como MVC funcionava corretamente, qual era a diferença entre eles.
    Tenha certeza que me ajudou muito..

    []s Raphael

    ResponderExcluir