Objetivo:
Implemente el uso del archivo .cs en MasterPage para reemplazar PageBase en el proyecto.
motivación:
La motivación para escribir este artículo proviene de la reconstrucción de un proyecto. En el proyecto de arquitectura B/S de .Net Framwork 2.0, se utilizaron las tecnologías PageBase y MasterPage. Se descubrió que cada vez que se accede a una página, la página accede a PageBase y MasterPage al mismo tiempo, lo que no solo provoca una degradación del rendimiento. pero incluso puede causar problemas en futuras expansiones y ajustes de funciones del proyecto. Errores lógicos ocultos.
Aspectos técnicos:
PageBase: una tecnología que se utiliza a menudo en .Net Framework 1.1 para encapsular la misma funcionalidad de varias páginas. La clase PageBase.cs hereda de la clase System.Web.UI.Page Las páginas web del proyecto heredan de la clase PageBase.cs Al anular el método de inicialización de la página en la clase base, se llaman las funciones comerciales en PageBase. tales como: parámetros de URL, guardar visitas y otras funciones (para métodos de implementación específicos, consulte el ejemplo oficial de Microsoft duwamishi).
MasterPage: una nueva característica en .Net Framework 2.0. Incluye físicamente dos archivos: archivo .Master (marcado html) y archivo .cs (código C#). El archivo .Master implementa el dibujo de la capa de visualización y el archivo .cs implementa funciones específicas. Las páginas web que heredan de MasterPage pueden heredar el contenido de la capa de visualización en MasterPage. Para dibujar un encabezado y pie de página comunes y personalizar un diseño unificado, MasterPage es una buena opción.
Requisitos de simulación:
Utilice la tecnología MasterPage para reemplazar PageBase e implementar la verificación de parámetros de la barra de direcciones.
Demos una explicación simple. La información de la tabla de inicio de sesión en la base de datos es la siguiente:
Después de iniciar sesión en el sistema, hay parámetros en la barra de direcciones URL, de la siguiente manera:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
En este momento, el usuario modifica manualmente los parámetros en la barra de direcciones URL como:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
Se considera una operación ilegal y el sistema volverá automáticamente a la página de inicio de sesión.
Primera iteración del código:
1. Consulte el método tradicional de PageBase:
El enfoque de página tradicional es:
PageBase de clase pública: System.Web.UI.Page
{
base de página pública()
{
}
/**//// <resumen>
/// Método de entrada
/// </summary>
vacío protegido Inicializar()
{
//Insertar lógica empresarial común
}
}
Página web:
Clase parcial pública TestPage: PageBase
{
//Método tradicional de llamar a PageBase
/**///// <resumen>
/// Anula el método OnPreInit() de la clase base y llama al método de verificación general
/// </summary>
/// <param nombre="e"></param>
anulación protegida anulación OnInit (eventargs e)
{
base.Inicializar();
}
}
Siga este enfoque y mueva el código de PageBase a MasterPage:
MasterPage.cs:
clase parcial pública MyMasterPage: System.Web.UI.MasterPage
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
si (!IsPostBack)
{
//Método de verificación de llamada
Inicializar();
}
}
}
Modifique el código en la página web para:
TestPage de clase parcial pública: System.Web.UI.Page
{
// Imita el método PageBase y llama al método en Master
/**//// <resumen>
/// Anula el método OnPreInit() de la clase base y llama al método de verificación general
/// </summary>
/// <param nombre="e"></param>
anulación protegida anulación OnInit (eventargs e)
{
// Obtener la referencia de la página maestra
MiPáginaMaestra miPáginaMaestra = (MiPáginaMaestra)this.Master;
//Llama al método de verificación general en la página maestra
si (!IsPostBack)
{
myMasterPage.Initialize();
}
}
}Reemplace el método Initialize() en MasterPage con el de la instancia, código de prueba:
Paso 1: Inicie sesión en el sistema con el nombre de usuario zhangsan y el inicio de sesión se realizará correctamente.
La página muestra que zhangsan puede iniciar sesión.
La dirección URL muestra:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Paso 2: modifique manualmente la barra de direcciones URL: de la siguiente manera:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
La página no mostrará el inicio de sesión de bienvenida de lisi, pero volverá a la página de inicio de sesión.
Reflexión: Aunque la función está implementada, todavía existen algunos enlaces insatisfactorios:
1. El método llamado por la subclase en Master debe ser un método público;
2. Aunque no es necesario modificar la herencia de la página web, aún debe copiar, pegar y anular mecánicamente el método OnInit () de la clase base.
Para eliminar estos sentimientos persistentes, comencé:
Segunda iteración del código:
Modifique el código en MasterPage.cs:
clase parcial pública MyMasterPage: System.Web.UI.MasterPage
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
si (!IsPostBack)
{
//Método de verificación de llamada
Comprobar inicio de sesión();
}
}
/**//// <resumen>
/// Verificar si el acceso es legal
/// </summary>
vacío privado CheckLogin()
{
// Si el número en la URL o el número en la cookie
si (cadena.IsNullOrEmpty(Request.QueryString["id"])
|| cadena.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Respuesta.Redirect("Iniciar sesión.aspx");
}//Si el número en la URL no coincide con el número en la cookie, regrese a la página de inicio de sesión
else if (int.Parse(Request.QueryString["id"])! = int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Respuesta.Redirect("Iniciar sesión.aspx");
}
}
} Después de la reconstrucción, la página web no se puede modificar de ninguna manera. MasterPage llama automáticamente al método de verificación en su propio método Page_Load () y establece el método de verificación en privado, que solo puede ser llamado por MasterPage para mejorar la seguridad. En este punto, el código parece ser ideal. Prueba:
Paso 1: inicie sesión en el sistema con el nombre de usuario zhangsan.
La página de inicio de sesión del usuario todavía se muestra.
La prueba falló.
Utilice puntos de interrupción para rastrear el código y descubra que el problema ocurre en el fragmento de código del método CheckLogin() en MasterPage.cs:
si (cadena.IsNullOrEmpty(Request.QueryString["id"])
|| cadena.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Respuesta.Redirect("Iniciar sesión.aspx");
}
Dado que la página de inicio de sesión hereda de MasterPage, el método de verificación en MasterPage.cs se llama automáticamente cuando se carga la página y sus propios parámetros no satisfacen el método string.IsNullOrEmpty (), por lo que regresa a la página de inicio de sesión. La página se carga nuevamente. Se llama al método de verificación en la clase base, formando así un bucle infinito.
En la tecnología PageBase, las páginas web pueden heredar selectivamente de PageBase, pero en la tecnología MasterPage, para obtener un efecto de capa de visualización consistente, la selectividad de las páginas web para heredar MasterPage es muy baja y no debemos crear la misma visualización creando una nuevo. MasterPage sin código de verificación se usa para heredar páginas web que no necesitan heredar las funciones de la clase base. Este método obviamente no es razonable. Para solucionar este problema se inició la tercera iteración:
Importe el archivo de configuración:
<?xml versión="1.0" codificación="utf-8" ?>
<páginas>
<página de prueba>
<título de la página="TestPage" url="TestPage.aspx" needvalidate="true"/>
<título de la página="Iniciar sesión" url="Iniciar sesión.aspx" needvalidate="false"/>
</página de prueba>
<páginas de administrador>
<título de la página="Página1" url="~/Admin/Page1.aspx" needvalidate="false"/>
<título de la página="Página2" url="~/Admin/Page2.aspx" needvalidate="false"/>
</adminpáginas>
</páginas>
Como puede ver, las páginas que deben verificarse están identificadas (needvalidate="true").
Cree una clase de acceso a datos XML:
clase pública XmlDAL
{
cadena estática privada filePath = string.Empty;
XmlDAL estático()
{
//Inicializa la ruta del archivo de configuración
filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml");
}
/**//// <resumen>
/// Obtenga la lista de páginas que deben verificarse
/// </summary>
/// <returns>Lista de páginas que requieren verificación</returns>
IList público estático<cadena> GetValidatePages()
{
IList<cadena> páginas = nueva Lista<cadena>();
// Si el archivo de configuración especificado existe
si (System.IO.File.Exists (filePath))
{
intentar
{
XmlDocument xmlDoc = nuevo XmlDocument();
xmlDoc.Load(rutadelarchivo);
// Obtener el nodo raíz del archivo de configuración
XmlNode raíz = xmlDoc.DocumentElement;
string xpath = "/pages/testpage/page[@needvalidate='true']";
XmlNodeList nodeList = root.SelectNodes(xpath);
// Colección de nodos de conveniencia
foreach (nodo XmlNode en nodeList)
{
páginas.Add(nodo.Atributos["título"].Valor);
}
}
captura (Excepción ex)
{
lanzar una nueva excepción (por ejemplo, mensaje);
}
}
páginas de retorno;
}
}
Refactorice el código en MasterPage.cs y agregue el método IsValidateNeeded (string url) para detectar si la página actual requiere verificación. Modifique el método de verificación:
clase parcial pública MyMasterPage: System.Web.UI.MasterPage
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
si (!IsPostBack)
{
//Método de verificación de llamada
Comprobar inicio de sesión();
}
}
/**//// <resumen>
/// Verificar si el acceso es legal
/// </summary>
vacío privado CheckLogin()
{
// Determinar si la página a la que se accede actualmente requiere verificación
si (IsValidateNeeded (Solicitud.RawUrl))
{
// Si el número en la URL o el número en la cookie
si (cadena.IsNullOrEmpty(Request.QueryString["id"])
|| cadena.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Respuesta.Redirect("Iniciar sesión.aspx");
}//Si el número en la URL no coincide con el número en la cookie, regrese a la página de inicio de sesión
else if (int.Parse(Request.QueryString["id"])! = int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Respuesta.Redirect("Iniciar sesión.aspx");
}
}
}
/**//// <resumen>
/// Verifica si la página actual requiere verificación
/// </summary>
/// <param name="currentPage">Nombre de la página actual</param>
/// <returns>Si es necesario verificar el estado</returns>
bool privado IsValidateNeeded (URL de cadena)
{
bool es necesario = falso;
// El método GetValidatePages() devuelve la lista de páginas que deben verificarse
IList<cadena> páginas = XmlDAL.GetValidatePages();
IEnumerator<cadena> es decir = páginas.GetEnumerator();
mientras (es decir, MoveNext())
{
// Si la página actual requiere verificación
si (url.Contiene(es decir,Actual))
//Volver al estado que requiere verificación
return es necesario = verdadero;
}
se necesita devolución;
}
}
Para probar:
Paso 1: Inicie sesión en el sistema con el nombre de usuario zhangsan y el inicio de sesión se realizará correctamente.
La página muestra que zhangsan puede iniciar sesión.
La dirección URL muestra:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Paso 2: modifique manualmente la barra de direcciones URL: de la siguiente manera:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
La página no mostrará el inicio de sesión de bienvenida de lisi, pero volverá a la página de inicio de sesión.
Esto concluye mi iteración de código.
Descarga de código: