Por que Razor _layout.cshtml tem um sublinhado principal no nome do arquivo?


144

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 .cshtmlarquivo que começa com um sublinhado?


Eu uso o NancyFX com o Razor e, como padrão, ele restringe qualquer conteúdo que não esteja na pasta Conteúdo. (Isso pode ser substituído no web.config ou na configuração personalizada), é impossível fornecer arquivos a todos, como .cshtml diretamente. Portanto, não uso "_" anexado aos meus nomes de exibição porque NÃO é necessário e feio.
Norbert Norbertson

Respostas:


205

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 @pagediretiva (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.


6
Obrigado. Para mim, esta é a resposta mais perspicaz. Eu estava com a má compreensão de que Razor estava ligado ao MVC. Agora vejo que o principal motivo de sublinhado é impedir que eles sejam veiculados diretamente nas páginas da Web do ASP.NET.
richb

1
Uma convenção de nomenclatura que realmente tem uma funcionalidade vinculada, pensei que a MS saberia melhor. E agora é transferido para o MVC, que deveria ser uma lousa limpa.
Boris B.

Felizmente, após as versões atuais do .NET Framework 4.5.1 e Visual Studio 2013, incluindo a funcionalidade "One ASP.NET", eles podem finalmente se afastar dessas limitações técnicas / codificação. É claro que nunca ter arquivos padrão compartilhados é essencial, como nos diretórios atuais * .config, APP_Code e APP_Data. Mas essa lógica deve estar em um arquivo de configuração em algum lugar (configuração da máquina como padrão) para que possa ser substituída. Além disso, esses nomes padrão de páginas comuns devem ser configuráveis ​​(Layout / Erro / etc ...).
7607 Tony Wall

1
@ Daniel Oh, entendo o que você quer dizer. Eu editei a resposta porque ela não funciona como anunciada.
Mike Brind

1
@ Daniel O que você está vendo é aparentemente um bug que apareceu no Razor Pages 2.1. Está programado para ser corrigido no 2.2. Funciona como descrevi em 2.0.
Mike Brind

12

É 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.


isso está incorreto, como apontado pela resposta acima - o sublinhado possui uma funcionalidade de segurança.
IJungleBoy 02/07

1
@iJungleBoy Veja a resposta aceita. para o ASP.net MVC (de que trata esta questão), não há funcionalidade de segurança. Consulte o web.config na pasta Views que já bloqueia todos os arquivos cshtml e aspx, com sublinhado ou não (configurado System.Web.HttpNotFoundHandlerpara eles).
Michael Stum

7

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".


4
Mas, por essa lógica, TODOS os arquivos cs & cshtml não seriam prefixados com um sublinhado?
richb

se todos os arquivos tiverem _ como prefixo, o site não funcionará ... os arquivos com prefixo _ serão renderizados dentro de uma página normal ... (para parciais), e o sitemaster é um modelo ... portanto, ele deve ter conteúdo para Ser exibido.
Juztin

Então, eu apenas tentei isso, e o IIS na minha caixa não serve nenhum arquivo do diretório Views. Nem mesmo arquivos .html estáticos. Então, eu realmente não acho que essa seja a resposta.
richb

Juztin: A questão é por que eles começam com um sublinhado? Se eu renomear _Layout.cshtm para Layout.cshtml, ainda funcionará bem. Então, qual é o motivo dessa convenção?
richb

2
A pergunta é sobre asp.net MVC, não webpages
fabspro

2

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.


1

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


@MikeBrind Você não pode 'navegar' para / navegar diretamente em qualquer uma das visualizações /viewem um projeto padrão do ASP.NET MVC; o /views/web.configarquivo está configurado para evitá-lo. Mas não há nada para impedir que uma ação do controlador retorne View("_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.
Andrew Barber

@MikeBrind Esta pergunta é sobre MVC, não sobre páginas da Web. Concedido; Eu não especifiquei isso no meu comentário original.
Andrew Barber

@ MikeBrind Eu estava - e estou - respondendo a esta resposta. Não é teu. Meu comentário inicial foi enganoso (eu também mencionei "parciais"), então eu o apaguei. Meu argumento foi e é que os sublinhados não têm nada a ver com não poder carregar uma exibição no MVC. Esse usuário até começou a dizer: "Eu não uso o MVC", mas essa pergunta era sobre o MVC. Só estou me certificando de que alguém que leia mais tarde esta resposta não pense que, no MVC, um sublinhado afeta a capacidade de uma ação do controlador carregar uma visualização. Nada demais. Concordamos que fui insolente em como falei. Feito.
Andrew Barber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.