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