No projeto padrão do ASP.NET MVC 3, o layout e os arquivos cshtml parciais começam com um sublinhado
_viewstart
_Layout
_LogOnPartial
Por que essa convenção e para que ela é usada? Preciso seguir esta convenção?
A estrutura atribui algum significado especial a um .cshtml
arquivo que começa com um sublinhado?
asp.net
asp.net-mvc-3
razor
richb
fonte
fonte
Respostas:
O Razor foi desenvolvido para o ASP.NET Web Pages (WebMatrix), que não possui o mesmo tipo de proteção incorporada às pastas e roteamento de Views que você obtém no MVC. Como as páginas de layout nas Páginas da Web não devem ser exibidas diretamente, elas são prefixadas com o sublinhado. E a estrutura de páginas da Web foi configurada para não permitir que arquivos com sublinhados principais em seus nomes sejam solicitados diretamente. Outros arquivos .cshtml nas Páginas da Web geralmente precisam ser navegáveis. Eles são equivalentes a arquivos .asp ou .php.
A equipe do ASP.NET declarou que as páginas da Web são um ponto de partida no desenvolvimento do ASP.NET, o que deve levar à migração para o MVC a tempo (para aqueles que desejam seguir em frente). Parte disso significa que deve ser o mais fácil possível migrar das Páginas da Web para o MVC. Consequentemente, faz sentido transferir as convenções de nomenclatura estabelecidas nas Páginas da Web para os arquivos do MVC Razor.
Portanto, não é uma razão técnica para prefixar os nomes de arquivo com um sublinhado - ele só não é relevante para MVC.
[ATUALIZAÇÃO outubro de 2018]
Na nova estrutura do ASP.NET Core Razor Pages (além da versão 2.1), os arquivos com um sublinhado à esquerda são ignorados quando as rotas são geradas na inicialização - mesmo que tenham uma
@page
diretiva (o que normalmente os tornaria uma página Razor rastreável) . É por isso que faz sentido nomear o layout e os arquivos parciais com um sublinhado à esquerda em um aplicativo Razor Pages se eles não pretendem ser navegados.fonte
É assim que o Ruby on Rails faz isso (os Partials começam com _, mas a chamada Render Partial não inclui _), e o ASP.net MVC se inspirou muito nele.
Nenhuma razão técnica, na verdade, apenas uma convenção para mostrar claramente a intenção de outros desenvolvedores (e você mesmo 6 meses depois) de dizer: Esta é uma visão parcial.
fonte
System.Web.HttpNotFoundHandler
para eles).As páginas que não podem ser mostradas por solicitações diretas do seu navegador (páginas mestras, visualizações parciais etc.) têm sublinhado (_) no início de seus nomes.
Portanto, se você tentar fazer a solicitação para _Layout.cshtml (esta é a página principal), receberá um erro do servidor.
É uma maneira de distinguir os arquivos que não podem ser navegados como páginas independentes, no mecanismo de exibição Razor.
Pense desta maneira ... no MVC 2 ... você diferenciaria a vista parcial e o site mestre com o sufixo .master, .ascx e as páginas normais são .aspx, por outro lado, na visualização Razor ... todas as visualizações são .cshtml; portanto, para distinguir páginas parciais e master, elas terão um prefixo (_). não é nada obrigatório, apenas uma "convenção".
fonte
Até onde eu sei, isso é simplesmente uma convenção usada para identificar a intenção do arquivo; Não acredito que isso realmente mude o comportamento do arquivo. Na maioria dos contextos de desenvolvimento, o acréscimo de um sublinhado identifica algo a ser usado para uso "privado", seja por uma classe ou, nesse caso, por outro modelo.
fonte
Eu não uso o MVC, mas com páginas da web que também usam a sintaxe do razor, o prefixo _ geralmente significa que a página não deve ser acessada por um usuário, mas por outras páginas ou algum código. Se você tentar navegar para uma página que contenha o _prefix, o asp.net impediria o acesso a ela. É por isso que é usado com páginas de layout e outras páginas, pois elas não devem ser acessadas diretamente por um usuário.
Algo como a pasta App_Code no asp.net
fonte
/view
em um projeto padrão do ASP.NET MVC; o/views/web.config
arquivo está configurado para evitá-lo. Mas não há nada para impedir que uma ação do controlador retorneView("_Index", model);
. Funciona muito bem; Acabei de fazer isso alterando o nome de uma visualização para _Index.cshtml e alterando a ação para chamar como fiz acima.