- 9.1. Introducción
- 9.2. Directivas
- 9.3. Expresiones y Bloques
- 9.4. Condicionales
- 9.5. Iteraciones
- 9.6. Inyección de Servicios
- 9.7. Helpers y Componentes
Razor es un motor de vistas que permite combinar HTML con código C#.
@{
var message = "Hola Mundo";
}
<h1>@message</h1>
<p>La fecha es: @DateTime.Now.ToString("dd/MM/yyyy")</p>| Directiva | Propósito |
|---|---|
@page |
Define la ruta de la página |
@model |
Especifica el tipo del modelo |
@using |
Añade using al código |
@inject |
Inyecta un servicio |
@section |
Define una sección para el layout |
@layout |
Especifica el layout a usar |
@attribute |
Añade atributos a la clase |
@namespace |
Define el namespace |
@addTagHelper |
Añade Tag Helpers |
@removeTagHelper |
Elimina Tag Helpers |
@tagHelperPrefix |
Define prefijo para Tag Helpers |
@page "/products"
@model ProductDetailModel
@using TiendaDawWeb.Shared.Models
@inject IProductService ProductService
@addTagHelper *, TiendaDawWeb.Mvc
@section Scripts {
<script src="~/js/products.js"></script>
}<!-- Expresión simple -->
<h1>@Model.Product.Nombre</h1>
<!-- Expresión con método -->
<p>@DateTime.Now.ToString("dd/MM/yyyy")</p>
<!-- Operador ternario -->
<p>Estado: @(product.Stock > 0 ? "En stock" : "Agotado")</p>
<!-- Conversión explícita -->
@((Html.Raw("<strong>Texto en negrita</strong>")))@{
// Declaraciones de variables
var title = "Mi Página";
var today = DateTime.Now;
// Funciones locales
string FormatPrice(decimal price) => price.ToString("C");
// Cálculos
var discount = 0.1m;
var finalPrice = product.Precio * (1 - discount);
}
<h1>@title</h1>
<p>Hoy es @today.ToString("dddd")</p>
<p>Precio final: @FormatPrice(finalPrice)</p>@if (Model.Product.Stock > 0)
{
<span class="badge bg-success">En stock</span>
}
else if (Model.Product.Stock > 0 && Model.Product.Stock < 10)
{
<span class="badge bg-warning">¡Últimas unidades!</span>
}
else
{
<span class="badge bg-danger">Agotado</span>
}@switch (order.Status)
{
case OrderStatus.Pending:
<span class="badge bg-warning">Pendiente</span>
break;
case OrderStatus.Processing:
<span class="badge bg-info">Procesando</span>
break;
case OrderStatus.Shipped:
<span class="badge bg-primary">Enviado</span>
break;
case OrderStatus.Delivered:
<span class="badge bg-success">Entregado</span>
break;
default:
<span class="badge bg-secondary">Desconocido</span>
break;
}@foreach (var product in Model.Products)
{
<div class="product-card">
<h3>@product.Nombre</h3>
<p>@product.Precio.ToString("C")</p>
</div>
}@for (int i = 0; i < Model.Pages; i++)
{
<a href="/page/@i" class="page-link">@(i + 1)</a>
}@{ var index = 0; }
@while (index < Model.Products.Count)
{
<div class="product">@Model.Products[index].Nombre</div>
index++;
}@page "/products"
@model ProductsModel
@inject IProductService ProductService
@inject IHtmlLocalizer<ProductsModel> Localizer
@{
var products = await ProductService.GetAllAsync();
}
<h1>@Localizer["ProductsTitle"]</h1>
@foreach (var product in products)
{
<div>@product.Nombre</div>
}// En el PageModel
[Inject]
public IProductService ProductService { get; set; } = null!;
// En la vista
@inject TiendaDawWeb.Shared.Services.IProductService ProductService<!-- Truncar texto -->
@product.Descripcion.Substring(0, 100)...
<!-- Formatear fecha -->
@Model.Order.Date.ToString("dd/MM/yyyy HH:mm")
<!-- Formatear número -->
@Model.Product.Precio.ToString("N2") unidades@{
RenderFragment button = @<button class="btn btn-primary">Click me</button>;
RenderFragment<string> badge = @<span class="badge">@context</span>;
}
@button
@badge("Mi Badge")| Concepto | Descripción |
|---|---|
@ |
Carácter de escape para código C# |
@{} |
Bloque de código C# |
@Model |
Referencia al modelo de la vista |
@inject |
Inyección de dependencias en la vista |
@section |
Sección para el layout |
Anterior: 08. Object Mapping
Próximo: 10. Internacionalización (I18n)