Files
Plataforma-de-desarrolladores/AGENTS_PAGE_STRUCTURE.md
Jorge Luis caudillo esparza 6685ef63fb Initial commit
2026-07-14 11:15:57 -07:00

89 lines
4.2 KiB
Markdown

# Reglas obligatorias para la ubicación de páginas WebForms
Estas reglas complementan `AGENTS.md` y aplican a toda página `.aspx` nueva.
## Raíz de páginas
- `SIG.Web/Pages/` es la raíz obligatoria para todas las páginas funcionales nuevas.
- No agregar páginas de aplicación directamente dentro de `SIG.Web/Pages/`; cada página debe pertenecer a una subcarpeta de módulo.
- Usar nombres de carpeta en PascalCase y conservar un solo nombre por módulo.
Estructura inicial:
```text
SIG.Web/
Pages/
Security/
Tramites/
Polizas/
```
Ejemplos futuros:
```text
Pages/Security/Usuarios.aspx
Pages/Security/Roles.aspx
Pages/Tramites/Solicitudes.aspx
Pages/Tramites/Seguimiento.aspx
Pages/Polizas/PrePolizas.aspx
```
- Crear nuevas carpetas bajo `Pages/` cuando aparezca un módulo real, por ejemplo `Clientes`, `Fraccionamientos`, `Ventas`, `Catalogos` o `Reportes`.
- No crear carpetas vacías para módulos que todavía no existen, salvo las carpetas iniciales acordadas.
- No colocar páginas de la aplicación dentro de `Metronic`, `Scripts`, `Styles`, `Content`, `AppCode` ni carpetas de paquetes o recursos de terceros.
- Los ejemplos `.aspx` incluidos dentro de dependencias visuales de `Metronic` son archivos heredados del proveedor y no cuentan como páginas funcionales de la aplicación. No usarlos como destino para código nuevo.
## Únicas páginas permitidas fuera de Pages
Las páginas de aplicación que actualmente están en la raíz son excepciones explícitas y son las únicas que pueden permanecer o existir fuera de `Pages/`:
```text
AccessDenied.aspx
Inicio.aspx
Login.aspx
Logout.aspx
```
- No agregar otra página `.aspx` en la raíz de `SIG.Web`.
- No mover estas cuatro páginas sin una solicitud explícita, porque sus rutas forman parte del inicio, autenticación y manejo global de acceso.
- `Login.aspx` sigue siendo la única página con estructura HTML completa propia.
- `Inicio.aspx` y `AccessDenied.aspx` usan `Site.master`.
- `Logout.aspx` puede permanecer como endpoint WebForms sin contenido visual.
## Archivos relacionados
- Mantener juntos los tres archivos de cada página:
```text
Pages/Modulo/Pagina.aspx
Pages/Modulo/Pagina.aspx.cs
Pages/Modulo/Pagina.aspx.designer.cs
```
- Incluir los tres archivos en `SIG.Web.csproj` con `DependentUpon` correcto.
- Usar namespaces que reflejen la carpeta, por ejemplo `SIG.Web.Pages.Security`.
- El atributo `Inherits` del `.aspx` debe coincidir exactamente con el namespace y la clase del code-behind.
- Todas las páginas normales deben usar `MasterPageFile="~/Site.master"` y los placeholders `H`, `C` y `J`.
- Todas las páginas normales deben heredar de `ClsPaginaBase`, salvo una excepción global documentada como Login, Logout o AccessDenied.
## Rutas y permisos
- Usar rutas virtuales completas, por ejemplo `~/Pages/Security/Usuarios.aspx`.
- Actualizar menús, módulos, permisos, redirecciones y breadcrumbs con la ruta real de la subcarpeta.
- No depender de rutas relativas como `../` para navegación de la aplicación.
- `PermissionService` y los procedimientos de acceso deben comparar la ruta incluyendo `Pages/Modulo/`.
- Los enlaces generados deben pasar por `ResolveUrl`, `VirtualPathUtility.ToAbsolute` o el mecanismo central existente.
## Arquitectura
- La ubicación dentro de `Pages/` no autoriza acceso directo a SQL.
- El code-behind debe permanecer delgado y llamar contratos/servicios.
- Toda operación de base de datos continúa usando procedimientos almacenados mediante repositorios.
- Los modelos, contratos, servicios y repositorios no deben colocarse dentro de `Pages/`; permanecen bajo sus carpetas de `AppCode`.
## Excepciones públicas de registro
Además de Login.aspx, las páginas Pages/Security/RegistroCliente.aspx, Pages/Security/RegistroPendiente.aspx y Pages/Security/VerificarCorreo.aspx pueden ser páginas públicas completas con su propio form runat="server". Son las únicas excepciones nuevas; las páginas autenticadas continúan usando Site.master y no declaran form.
RegistroCliente.aspx debe manejar el borrador de ambos pasos en ViewState cifrado y no persistir información hasta terminar todas las validaciones. La persistencia final debe usar servicios/repositorios y un procedimiento almacenado transaccional.