Diretivas Razor
Diretivas
As diretivas Razor são representadas por expressões implícitas com palavras-chave reservadas após o símbolo @. Uma diretiva normalmente altera a forma como uma view é processada ou habilita funcionalidades diferentes.
Entender como o Razor gera código para uma view facilita a compreensão de como as diretivas funcionam.
@{
string quote = "Envelhecer não é para os fracos! - Anônimo";
}
<div>Citação do Dia: @quote</div>
O código gera uma classe semelhante à seguinte:
public class _Views_Something_cshtml : RazorPage<dynamic>
{
public override async Task ExecuteAsync()
{
string output = "Envelhecer não é para os fracos! - Anônimo";
WriteLiteral("/r/n<div>Citação do Dia: ");
Write(output);
WriteLiteral("</div>");
}
}
@attribute
A diretiva @attribute adiciona o atributo fornecido à classe da página ou view gerada. O exemplo a seguir adiciona o atributo [Authorize]:
@attribute [Authorize]
A diretiva @attribute também pode ser usada para fornecer um template de rota baseado em constante em um componente Razor. No exemplo a seguir, a diretiva @page em um componente é substituída pela diretiva @attribute e o template de rota baseado em constante em Constants.CounterRoute, que é definido em outro lugar no app como “/counter”:
@page "/counter"
@attribute [Route(Constants.CounterRoute)]
@code
Este cenário se aplica apenas a componentes Razor (.razor).
O bloco @code permite que um componente Razor adicione membros C# (campos, propriedades e métodos) a um componente:
@code {
// Membros C# (campos, propriedades e métodos)
}
Para componentes Razor, @code é um alias de @functions e é recomendado em vez de @functions. Mais de um bloco @code é permitido.
@functions
A diretiva @functions permite adicionar membros C# (campos, propriedades e métodos) à classe gerada:
@functions {
// Membros C# (campos, propriedades e métodos)
}
Em componentes Razor, use @code em vez de @functions para adicionar membros C#.
Por exemplo:
@functions {
public string GetHello()
{
return "Olá";
}
}
<div>Do método: @GetHello()</div>
O código gera a seguinte marcação HTML:
<div>Do método: Olá</div>
O código a seguir é a classe C# Razor gerada:
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Razor;
public class _Views_Home_Test_cshtml : RazorPage<dynamic>
{
// Funções colocadas entre aqui
public string GetHello()
{
return "Olá";
}
// E aqui.
#pragma warning disable 1998
public override async Task ExecuteAsync()
{
WriteLiteral("\r\n<div>Do método: ");
Write(GetHello());
WriteLiteral("</div>\r\n");
}
#pragma warning restore 1998
Os métodos @functions servem como métodos de template quando possuem marcação:
@{
RenderName("Mahatma Gandhi");
RenderName("Martin Luther King, Jr.");
}
@functions {
private void RenderName(string name)
{
<p>Nome: <strong>@name</strong></p>
}
}
O código renderiza o seguinte HTML:
<p>Nome: <strong>Mahatma Gandhi</strong></p>
<p>Nome: <strong>Martin Luther King, Jr.</strong></p>
@implements
A diretiva @implements implementa uma interface para a classe gerada.
O exemplo a seguir implementa System.IDisposable para que o método Dispose possa ser chamado:
@implements IDisposable
<h1>Exemplo</h1>
@functions {
private bool _isDisposed;
...
public void Dispose() => _isDisposed = true;
}
@inherits
A diretiva @inherits fornece controle total sobre a classe da qual a view herda:
@inherits TypeNameOfClassToInheritFrom
O código a seguir é um tipo de página Razor customizada:
using Microsoft.AspNetCore.Mvc.Razor;
public abstract class CustomRazorPage<TModel> : RazorPage<TModel>
{
public string CustomText { get; } =
"Gardyloo! - Um aviso escocês gritado da janela antes de jogar" +
"um balde de resíduos na rua abaixo.";
}
O CustomText é exibido em uma view:
@inherits CustomRazorPage<TModel>
<div>Texto customizado: @CustomText</div>
O código renderiza o seguinte HTML:
<div>
Texto customizado: Bumbershoot - Outro nome para guarda-chuva.
</div>
@model e @inherits podem ser usados na mesma view. @inherits pode estar em um arquivo _ViewImports.cshtml que a view importa:
@inherits CustomRazorPage<TModel>
O código a seguir é um exemplo de view fortemente tipada:
@inherits CustomRazorPage<TModel>
<div>Email de Login: @Model.Email</div>
<div>Texto customizado: @CustomText</div>
Se “jade@nuevofoundation.org ” for passado no modelo, a view gera a seguinte marcação HTML:
<div>Email de Login: jade@nuevofoundation.org</div>
<div>
Texto customizado: Bumbershoot - Outro nome para guarda-chuva.
</div>
@inject
A diretiva @inject permite que a Razor Page injete um serviço do container de serviços em uma view.
@layout
Este cenário se aplica apenas a componentes Razor (.razor).
A diretiva @layout especifica um layout para componentes Razor roteáveis que possuem uma diretiva @page. Componentes de layout são usados para evitar duplicação de código e inconsistência.
@model
Este cenário se aplica apenas a views MVC e Razor Pages (.cshtml).
A diretiva @model especifica o tipo do modelo passado para uma view ou página:
@model TypeNameOfModel
Em um app ASP.NET Core MVC ou Razor Pages criado com contas de usuário individuais, Views/Account/Login.cshtml contém a seguinte declaração de modelo:
@model LoginViewModel
A classe gerada herda de RazorPage
public class _Views_Account_Login_cshtml : RazorPage<LoginViewModel>
O Razor expõe uma propriedade Model para acessar o modelo passado para a view:
<div>Email de Login: @Model.Email</div>
A diretiva @model especifica o tipo da propriedade Model. A diretiva especifica o T em RazorPage<T> da classe gerada da qual a view deriva. Se a diretiva @model não for especificada, a propriedade Model é do tipo dynamic. Para mais informações, veja Modelos fortemente tipados e a palavra-chave @model.
@namespace
A diretiva @namespace:
- Define o namespace da classe da página Razor, view MVC ou componente Razor gerado.
- Define os namespaces derivados raiz das classes de páginas, views ou componentes a partir do arquivo de importação mais próximo na árvore de diretórios, _ViewImports.cshtml (views ou páginas) ou _Imports.razor (componentes Razor).
@namespace Your.Namespace.Here
Para o exemplo de Razor Pages mostrado na tabela a seguir:
- Cada página importa Pages/_ViewImports.cshtml.
- Pages/_ViewImports.cshtml contém @namespace Hello.World.
- Cada página tem Hello.World como raiz do seu namespace.
| Página | Namespace |
|---|---|
| Pages/Index.cshtml | Hello.World |
| Pages/MorePages/Page.cshtml | Hello.World.MorePages |
| Pages/MorePages/EvenMorePages/Page.cshtml | Hello.World.MorePages.EvenMorePages |
Os relacionamentos acima se aplicam a arquivos de importação usados com views MVC e componentes Razor.
Quando múltiplos arquivos de importação possuem a diretiva @namespace, o arquivo mais próximo da página, view ou componente na árvore de diretórios é usado para definir o namespace raiz.
Se a pasta EvenMorePages no exemplo acima tiver um arquivo de importação com @namespace Another.Planet (ou o arquivo Pages/MorePages/EvenMorePages/Page.cshtml contiver @namespace Another.Planet), o resultado é mostrado na tabela a seguir.
| Página | Namespace |
|---|---|
| Pages/Index.cshtml | Hello.World |
| Pages/MorePages/Page.cshtml | Hello.World.MorePage |
| Pages/MorePages/EvenMorePages/Page.cshtml | Another.Planet |
@page
A diretiva @page tem efeitos diferentes dependendo do tipo de arquivo onde aparece. A diretiva:
- Em um arquivo .cshtml indica que o arquivo é uma Razor Page.
- Especifica que um componente Razor deve lidar diretamente com requisições.
@preservewhitespace
Este cenário se aplica apenas a componentes Razor (.razor).
Quando definido como false (padrão), o espaço em branco na marcação renderizada de componentes Razor (.razor) é removido se:
- Estiver no início ou fim dentro de um elemento.
- Estiver no início ou fim dentro de um parâmetro RenderFragment. Por exemplo, conteúdo filho passado para outro componente.
- Preceder ou seguir um bloco de código C#, como
@ifou@foreach.
@section
Este cenário se aplica apenas a views MVC e Razor Pages (.cshtml).
A diretiva @section é usada em conjunto com layouts de MVC e Razor Pages para permitir que views ou páginas renderizem conteúdo em diferentes partes da página HTML.
@typeparam
Este cenário se aplica apenas a componentes Razor (.razor).
A diretiva @typeparam declara um parâmetro de tipo genérico para a classe do componente gerado:
@typeparam TEntity
Tipos genéricos com restrições de tipo where são suportados:
@typeparam TEntity where TEntity : IEntity
@using
A diretiva @using adiciona a diretiva using do C# à view gerada:
@using System.IO
@{
var dir = Directory.GetCurrentDirectory();
}
<p>@dir</p>
Em componentes Razor, @using também controla quais componentes estão em escopo.
Atributos de diretiva
Atributos de diretiva Razor são representados por expressões implícitas com palavras-chave reservadas após o símbolo @. Um atributo de diretiva normalmente altera a forma como um elemento é processado ou habilita funcionalidades diferentes.
@attributes
Este cenário se aplica apenas a componentes Razor (.razor).
@attributes permite que um componente renderize atributos não declarados.
@bind
Este cenário se aplica apenas a componentes Razor (.razor).
O data binding em componentes é realizado com o atributo @bind.
<input type="checkbox" @bind="todo.IsDone" />
Este exemplo vincula a propriedade IsDone do objeto todo à checkbox.
@bind:culture
Este cenário se aplica apenas a componentes Razor (.razor).
Use o atributo @bind:culture junto com o atributo @bind para fornecer um System.Globalization.CultureInfo para analisar e formatar um valor.
@on{EVENT}
Este cenário se aplica apenas a componentes Razor (.razor).
O Razor fornece recursos de manipulação de eventos para componentes.
<button @onclick="AddTodo">Adicionar tarefa</button>
Com este código, quando alguém clica no botão, o método AddToDo é chamado.
@ref
Este cenário se aplica apenas a componentes Razor (.razor).
Referências de componente (@ref) fornecem uma maneira de referenciar uma instância de componente para que você possa emitir comandos para essa instância.
Palavras-chave reservadas do Razor
Palavras-chave do Razor
- page
- namespace
- functions
- inherits
- model
- section
Palavras-chave do Razor são escapadas com @(Palavra-chave Razor) (por exemplo, @(functions)).
Palavras-chave C# do Razor
- case
- do
- default
- for
- foreach
- if
- else
- lock
- switch
- try
- catch
- finally
- using
- while
Palavras-chave C# do Razor devem ser duplamente escapadas com @(@Palavra-chave C# do Razor) (por exemplo, @(@case)). O primeiro @ escapa o parser do Razor. O segundo @ escapa o parser do C#.
Palavras-chave reservadas não usadas pelo Razor
- class