none
ASP.NET MVC - Estrutura da View RRS feed

  • Pergunta

  • Caros, 

    Estou começando a aprender ASP.NET MVC em uma vídeo aula e o autor cria no Controle um Array de strings para depois exibir pela View todos de uma vez por um laço for.

    No meu Controle DadosController.cs tenho um ActionResult chamado ReturnArray

    DadosController.cs

     

    public ActionResult ReturnArray()
        {
    
          string[] arrayNomes = { "Rodrigo", "Maria", "João", "Danilo" };
          ViewData["nomes"] = arrayNomes;
          return View();
        }
    

     
    E uma View chamada

    ReturnArray.ascx

    <% for (int i = 0; i < ((string[])ViewData["nomes"]).Length; i++)
      { %>
    
    <% Response.Write(((string[])ViewData["nomes"]).GetValue(i) + "<br />"); %>
    
    <% 
      }
    %>
    


    Gostaria de saber porque foi necessário ele colocar essa confusão de abre e fecha <% %>

    Não ficaria mais simples em modo de desenvolvimento e visualização do código colocar desta maneira:

    <% 
      for (int i = 0; i < ((string[])ViewData["nomes"]).Length; i++)
      {
       Response.Write(((string[])ViewData["nomes"]).GetValue(i) + "<br />");
      }
    %>
    

    1º Dessa forma que eu fiz não é correta e pode deixar alguma lentidão?
    2º Quando eu quiser falar sobre esse abre e fecha de porcentagem <% %> de chaves como eu posso definir a palavra correta?

    segunda-feira, 30 de maio de 2011 05:56

Respostas

  • Rodrigo essa é a sintaxe do mvc na parte asp isso até a versão 2 no mvc 3 usa razor e a sintaxe muda para @ ao invés de <% %> é mais fácil pelo menos eu acho.
    Junior
    • Marcado como Resposta Rodrigo Epic terça-feira, 31 de maio de 2011 07:27
    segunda-feira, 30 de maio de 2011 11:24
  • Olá Rodrigo,

    1-) A forma que você fez não está errada. Funciona das duas formas. Uma View em ASP .NET MVC tem sempre uma mistura de código HTML/JavaScript + CSharp (ou VB .NET), portanto você precisa avisar o parser quando começa o código CSharp/VB .NET (<%) e quando termina (%>), e assim ele sabe que o código que está fora do "<% ... %>" é HTML/JavaScript.

    2-) (Não entendi a pergunta)

    3-) Apesar de "funcionar" das duas formas, o ideal seria a sua View receber os dados de forma fortemente tipada, para não precisar utilizar o dicionário ViewData e ter de fazer esse monte de casts.

    Algo mais ou menos assim:

    public class DadosController : Controller
    {
      public ActionResult ObterArray()
      {
        string[] nomes = { "Rodrigo", "Maria", "João", "Danilo" };
    
        // Devolve a lista de nomes como "model" da View
        return View(nomes);
      }
    }
    
    

    E depois, na View, basta percorrer o seu Model e tratá-lo como um IEnumerable de String (e um array de String, é um IEnumerable de String, assim como um array de int é um IEnumerable de int):

    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<string>>" %>
    
    <% foreach (string nome in Model)
      {%>
    
        <%= nome %><br />
    <%
      }%>
    

    Abraços,

    Caio Proiete
    http://caioproiete.net
    http://twitter.com/CaioProiete

    • Marcado como Resposta Rodrigo Epic terça-feira, 31 de maio de 2011 07:27
    segunda-feira, 30 de maio de 2011 15:43
    Moderador

Todas as Respostas

  • Rodrigo essa é a sintaxe do mvc na parte asp isso até a versão 2 no mvc 3 usa razor e a sintaxe muda para @ ao invés de <% %> é mais fácil pelo menos eu acho.
    Junior
    • Marcado como Resposta Rodrigo Epic terça-feira, 31 de maio de 2011 07:27
    segunda-feira, 30 de maio de 2011 11:24
  • Olá Rodrigo,

    1-) A forma que você fez não está errada. Funciona das duas formas. Uma View em ASP .NET MVC tem sempre uma mistura de código HTML/JavaScript + CSharp (ou VB .NET), portanto você precisa avisar o parser quando começa o código CSharp/VB .NET (<%) e quando termina (%>), e assim ele sabe que o código que está fora do "<% ... %>" é HTML/JavaScript.

    2-) (Não entendi a pergunta)

    3-) Apesar de "funcionar" das duas formas, o ideal seria a sua View receber os dados de forma fortemente tipada, para não precisar utilizar o dicionário ViewData e ter de fazer esse monte de casts.

    Algo mais ou menos assim:

    public class DadosController : Controller
    {
      public ActionResult ObterArray()
      {
        string[] nomes = { "Rodrigo", "Maria", "João", "Danilo" };
    
        // Devolve a lista de nomes como "model" da View
        return View(nomes);
      }
    }
    
    

    E depois, na View, basta percorrer o seu Model e tratá-lo como um IEnumerable de String (e um array de String, é um IEnumerable de String, assim como um array de int é um IEnumerable de int):

    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<string>>" %>
    
    <% foreach (string nome in Model)
      {%>
    
        <%= nome %><br />
    <%
      }%>
    

    Abraços,

    Caio Proiete
    http://caioproiete.net
    http://twitter.com/CaioProiete

    • Marcado como Resposta Rodrigo Epic terça-feira, 31 de maio de 2011 07:27
    segunda-feira, 30 de maio de 2011 15:43
    Moderador
  • Umm perfeito.
    Muito obrigado Junior e em especial Caio pelo ótimo exemplo
    :D
     
    terça-feira, 31 de maio de 2011 07:27