Layouts no ASP.NET MVC
Os Layouts no ASP.NET MVC funcionam como modelos globais para garantir uma identidade visual consistente em toda a aplicação. Eles desempenham um papel similar às Master Pages do Web Forms, porém com uma sintaxe baseada em Razor muito mais leve e flexível. Um arquivo de layout define a estrutura comum (como cabeçalhos e rodapés), permitindo que as views injetem seu conteúdo específico em locais determinados.
<html lang="pt-br">
<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.AppTitle</title>
@Styles.Render("~/assets/css")
@Scripts.Render("~/bundles/base-scripts")
</head>
<body>
<header>
<nav>Menu Principal</nav>
</header>
<main class="container">
@RenderBody()
</main>
<footer>
@RenderSection("FooterExtra", required: false)
</footer>
</body>
</html>
Para aplicar um layout a uma view específica, define-se a propriedade Layout no topo do arquivo .cshtml:
@{
Layout = "~/Views/Shared/_MainLayout.cshtml";
}
Uso de Sections (Seções)
As Seções permitem definir blocos de conteúdo que podem ser injetados em locais específicos do Layout, além do corpo principal. Por padrão, se uma seção for declarada no Layout com @RenderSection("Nome"), a view correspondente deve implementá-la, a menos que o parâmetro required seja definido como false.
@section FooterExtra {
<p>Conteúdo específico para o rodapé desta página.</p>
}
RenderBody vs. RenderPage
- RenderBody: Utilizado exclusivamante em páginas de layout para renderizar o conteúdo da view que não está contido em nenhuma seção. Cada layout deve possuir exatamente uma chamada para este método.
- RenderPage: Serve para injetar o conteúdo de outra página (partial ou arquivo .cshtml) em qualquer lugar da sua view ou layout. Pode ser chamado múltiplas vezes em um único arquivo.
<div class="wrapper">
@RenderPage("~/Views/Shared/_UserPanel.cshtml")
@RenderBody()
</div>
Otimização com Bundling e Minification
As classes Styles.Render e Scripts.Render facilitam o gerenciamento de arquivos estáticos. O Bundling agrupa múltiplos arquivos CSS ou JS em um único arquivo para reduzir o número de requisições HTTP, enquanto a Minificação remove espaços e comentários para diminuir o tamanho dos dados transferidos.
A configuração é feita na classe BundleConfig:
public class BundleConfig
{
public static void RegisterBundles(BundleCollection list)
{
list.Add(new ScriptBundle("~/bundles/validations").Include(
"~/Scripts/jquery.validate*",
"~/Scripts/app/custom-validators.js"));
list.Add(new StyleBundle("~/assets/themes").Include(
"~/Content/bootstrap.css",
"~/Content/site-theme.css"));
}
}
Para ativar a otimização em ambiente de desnevolvimento (que geralmente vem desativada para debug), utiliza-se a propriedade EnableOptimizations no Global.asax.cs:
protected void Application_Start()
{
// Habilita o agrupamento e minificação explicitamente
System.Web.Optimization.BundleTable.EnableOptimizations = true;
}
O Arquivo _ViewStart.cshtml
O arquivo _ViewStart.cshtml é executado automaticamente antes de qualquer view na mesma pasta (ou subpastas). Ele é ideal para definir configurações globais, como o layout padrão, evitando a repetição de código em cada arquivo individual.
É possível aplicar lógicas dinâmicas para carregar layouts diferentes baseados no controlador:
@{
var activeController = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
if (activeController == "Dashboard")
{
Layout = "~/Views/Shared/_AdminTemplate.cshtml";
}
else
{
Layout = "~/Views/Shared/_PublicTemplate.cshtml";
}
}
A Pasta App_Start
Introduzida para organizar as configurações de inicialização, esta pasta contém classes estáticas essenciais:
- BundleConfig.cs: Configuração de pacotes CSS e JavaScript.
- FilterConfig.cs: Registro de filtros globais (ex: tratamento de erros).
- RouteConfig.cs: Definição dos padrões de URL da aplicação.
- WebApiConfig.cs: Configurações específicas para serviços HTTP Web API.
Estratégias de Retorno de Views e Redirecionamento
Existem diferentes maneiras de processar o fluxo de saída em um Controller:
- Return View(): Renderiza a view diretamente. Não altera a URL no navegador e funcoina como uma transferência interna no servidor.
- Return RedirectToAction(): Envia um código de status HTTP 302 para o navegador, solicitando uma nova requisição para uma ação específica. A URL no navegador é atualizada.
- Return Redirect(): Semelhante ao anterior, mas exige que o desenvolvedor forneça a URL completa ou relativa manualmente.
- Return RedirectToRoute(): Realiza o redirecionamento baseando-se em uma rota específica definida na tabela de roteamento, disparando uma nova requisição HTTP.