none
Uma dúvida boba mas é dúvida RRS feed

  • Pergunta

  • Quando criamos um projeto MVC, ele cria um esqueleto com algumas Controller, Views e etc. Bem, acontece que existe uma view chamada de _ViewStart. Bem, se eu altero essa view e rodo eu vejo essas alterações, mas o conteúdo dela é da View Index. Como acontece isso? Como ela chama a view Index, mas se é ela que sobe ou não? Se não, como é se eu acrescento um textbox nela, eu visualizo na renderização?
    quarta-feira, 28 de agosto de 2013 18:45

Respostas

  • Sempre que você cria um projeto MVC do zero, se você reparar bem la na RouteConfig.cs, verá que  o padrão dele é Home/Index, onde Home é a Controller e Index a View conforme código abaixo.

      public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }
        }

    A _ViewStart faz a chamada para a Layout que se trata da "MasterPage". Se você colocar qualquer coisa dentro da <div> nessa _Layout verá que ira aparecer no topo da sua página. 

    Caso queira efetuar a chamada de uma nova pagiana você deve alterar seu RouteConfig.cs, deixando ele mais ou menos assim:

     public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "MinhaController", action = "MinhaView", id = UrlParameter.Optional }
                );
            }
        }

    Caso queira dar um UP em tudo isso que eu falei entra nesse blog http://cleytonferrari.com/ que tem algumas video aulas explicando um MVC básico. Com isso você irá entender bem melhor.

    Se ajudou marca ai.

    Abras Good Luck.

    • Marcado como Resposta pnet quinta-feira, 29 de agosto de 2013 13:27
    quinta-feira, 29 de agosto de 2013 13:17

Todas as Respostas

  • Cara, isso é o básico do Asp.net MVC. Sugiro você estudar um pouco como as Views, Controllers e Models se interagem entre si antes mesmo de escrever código.

    Resumidamente, se voce vem do WebForms, essa _ViewStart funciona como uma Master Page, isto é, serve como uma estrutura de  layout para as outras páginas.


    Take a look at WPF FlashMessage
    About.me

    quarta-feira, 28 de agosto de 2013 22:18
  • Não, a master é a _Layout.cshtml. A pergunta é onde a Index é chamada pela _ViewStart.
    quarta-feira, 28 de agosto de 2013 23:51
  • Para cada View vc precisa declarar qual o layout que ela usa (_Layout.cshtml). Para você não precisar fazer isso em toda View, você declara o layout usado em todas as views no _ViewStart.

    http://forums.asp.net/t/1780643.aspx/1


    Take a look at WPF FlashMessage
    About.me

    quinta-feira, 29 de agosto de 2013 01:04
  • Acho q vcs não entenderam minha dúvida. Vou pesquisar mais e posto mais para vocês, valeu.
    quinta-feira, 29 de agosto de 2013 11:45
  • Sempre que você cria um projeto MVC do zero, se você reparar bem la na RouteConfig.cs, verá que  o padrão dele é Home/Index, onde Home é a Controller e Index a View conforme código abaixo.

      public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }
        }

    A _ViewStart faz a chamada para a Layout que se trata da "MasterPage". Se você colocar qualquer coisa dentro da <div> nessa _Layout verá que ira aparecer no topo da sua página. 

    Caso queira efetuar a chamada de uma nova pagiana você deve alterar seu RouteConfig.cs, deixando ele mais ou menos assim:

     public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "MinhaController", action = "MinhaView", id = UrlParameter.Optional }
                );
            }
        }

    Caso queira dar um UP em tudo isso que eu falei entra nesse blog http://cleytonferrari.com/ que tem algumas video aulas explicando um MVC básico. Com isso você irá entender bem melhor.

    Se ajudou marca ai.

    Abras Good Luck.

    • Marcado como Resposta pnet quinta-feira, 29 de agosto de 2013 13:27
    quinta-feira, 29 de agosto de 2013 13:17
  • Marquei como resposta sim para encerrar isso, mas não me respondeu claramente, que é onde a _ViewStart.cshtml chama a Index, em que momento ou vice-versa. Pois a _ViewStart.cshtml herda de _Layout.cshtml e Index é a view padrão roteada, isso eu já sei. Só quero saber como a _ViewStart chama a Index ou o contrário, em que parte do código eu vejo isso.
    quinta-feira, 29 de agosto de 2013 13:27
  • pnet ela chama as demais Views sendo a Index ou outra com o código

    @RenderPage("~/Views/Shared/_ProgramaLeiloesMaster.cshtml")
    @RenderBody()

    Por padrão ela utiliza a @RenderBody que irá renderizar a Index. 

    Você pode colocar o @RenderPage caso queira chamar uma página específica.

    Agora acho que respondeu. 

    Abras

    quinta-feira, 29 de agosto de 2013 13:30
  • Então, é isso que eu quero dizer, não existe nenhum código a não ser esse:

    @{
        Layout = "~/Views/Shared/_Layout.cshtml";
    }

    Estou insistindo nisso, que comecei a estudar para certificação e preciso ter domínio sobre essas coisas, de onde vem tal coisa em que lugar se encontra e etc...

    Não vi nada nessa View, nem no Global.asax, nem no RouteConfig.cs, nem muito menos nas controllers e etc... E se eu não souber desses básicos, para dominar o código, fica difícil passar nos testes. Já fiz pra java e sei que certificação é barra.

    quinta-feira, 29 de agosto de 2013 15:38
  • Cara, na _ViewStart você não vai encontrar código nenhum do que eu falei, realmente ela irá conter apenas o que você postou. 

    Você percebe que a sua _ViewStart faz referência para a sua _Layout? 

    O código @RenderBody, fica na sua _Layout que seria como uma "master", e é esse @RenderBody que irá renderizar a Index...

    Não vou saber te dizer a fundo como o @RenderBody trabalha, mas, ele é essencial para o funcionamento da aplicação.


    quinta-feira, 29 de agosto de 2013 16:49
  • Olá Fernando,

    Podemos colocar o _ViewStart.cshtml dentro da pasta raiz das Views ou na pasta aonde se encontra as demais pastas com as Views (Home, Produto e etc).

    -Views
    --Home
    ----Index.cshtml
    ----Edit.cshtml
    ----Add.cshtml
    ----Create.cshtml
    ----_ViewStart.cshtml (aqui ele usa o Layout A)
    --Produto
    ----Index.cshtml
    ----Edit.cshtml
    ----Add.cshtml
    ----Create.cshtml
    ----_ViewStart.cshtml (aqui ele usa o Layout B)
    --Carrinho
    ----Index.cshtml
    ----Edit.cshtml
    ----Add.cshtml
    ----Create.cshtml
    -_ViewStart.cshtml (aqui ele usa o Layout C, apenas as views da Carrinho vai usar, pois elas não tem um arquivo ViewStat dentro da pasta "Carrinho")

    Sua função é reduzir a redundância no código, evitando re-trabalho de colocar a propriedade Layout em todas as Views, imagina que na sua pasta Produto existe 30 Views (*.cshtml) e todos usem do mesma Master Page (Layout), imagine agora que o seu chefe peça para você mudar o Layout de B para A, ao invés de você fazer isso nas 30 Views, você só faz no arquivo _ViewStart e isso sera refletido em todas as Views desta pasta.

    Uma boa definição é a do livro ASP.NET Professional MVC 4

    In the preceding examples, each view specified its layout page using the Layout property. For a group of views that all use the same layout, this can get a bit redundant and harder to maintain.

    The _ViewStart.cshtml page can be used to remove this redundancy. The code within this file is executed before the code in any view placed in the same directory. This file is also recursively applied to any view within a subdirectory.

    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    sexta-feira, 30 de agosto de 2013 13:19
  • Fala Vitor. 

    Obrigado pela dica do livro, venho do Web Forms pro MVC estou iniciando ainda nesse conceito, mas já me interesso muito por esse novo conceito e que tem muitas novas facilidades para nós desenvolvedores. Ainda conheço o básico, mas tento passar um pouco desse conhecimento apesar de pouco para outros colegas que enfrentam dificuldades como as que eu já tive. 

    Mas essa ideia da ViewStart eu ainda não tinha pensado. Apesar de eu estar usando uma "master" sendo chamada na minha _Layout através do @RenderPage. 

    Mais uma vez obrigado pela dica. 

    Abras

    sexta-feira, 30 de agosto de 2013 13:30